pub mod config;
pub mod join_output;
pub mod name_constructors;
pub mod parse;
pub use config::Config;
use proc_macro2::TokenStream;
use quote::ToTokens;
use syn::Path;
use super::handler::Handler;
use crate::action_expr_chain::ActionExprChain;
use crate::chain::Chain;
use join_output::JoinOutput;
use syn::parse_quote;
pub trait JoinInput {
type Chain: Chain;
type Handler;
fn futures_crate_path(&self) -> Option<&Path>;
fn branches(&self) -> &[Self::Chain];
fn handler(&self) -> Option<&Self::Handler>;
fn joiner(&self) -> Option<&TokenStream>;
fn transpose_results_option(&self) -> Option<bool>;
fn lazy_branches_option(&self) -> Option<bool>;
}
pub struct JoinInputDefault {
pub futures_crate_path: Option<Path>,
pub custom_joiner: Option<TokenStream>,
pub transpose_results: Option<bool>,
pub lazy_branches: Option<bool>,
pub branches: Vec<ActionExprChain>,
pub handler: Option<Handler>,
}
impl JoinInput for JoinInputDefault {
type Chain = ActionExprChain;
type Handler = Handler;
fn futures_crate_path(&self) -> Option<&Path> {
self.futures_crate_path.as_ref()
}
fn branches(&self) -> &[Self::Chain] {
&self.branches
}
fn handler(&self) -> Option<&Self::Handler> {
self.handler.as_ref()
}
fn joiner(&self) -> Option<&TokenStream> {
self.custom_joiner.as_ref()
}
fn transpose_results_option(&self) -> Option<bool> {
self.transpose_results.as_ref().copied()
}
fn lazy_branches_option(&self) -> Option<bool> {
self.lazy_branches.as_ref().copied()
}
}
pub fn generate_join<T: JoinInput<Chain = ActionExprChain, Handler = Handler>>(
join: &T,
config: Config,
) -> TokenStream {
let default_futures_crate_path = parse_quote! { ::futures };
JoinOutput::new(
join.branches(),
join.handler(),
if let Some(futures_crate_path) = join.futures_crate_path() {
Some(futures_crate_path)
} else if config.is_async {
Some(&default_futures_crate_path)
} else {
None
},
join.joiner(),
join.transpose_results_option(),
join.lazy_branches_option(),
config,
)
.unwrap()
.into_token_stream()
}