use anyhow::Result;
use proc_macro2::TokenStream;
use quote::quote;
use syn::Ident;
pub(crate) fn generate_thread_creator(
rx_request: Ident,
tx_response: Ident,
target_step_ident: Ident,
target_step_pods_ident: Ident,
) -> Result<TokenStream> {
Ok(quote! {
if !#rx_request.is_empty()
&& prev_pods_size + #target_step_pods_ident.len() < max_thread_count
{
let thread = std::thread::spawn({
let rx_request = #rx_request.clone();
let tx_response = #tx_response.clone();
move || {
while let Ok(req) = rx_request.try_recv() {
let res = #target_step_ident::run(req);
match res {
::ichika::Status::Next(res) => tx_response.send(res).unwrap(),
_ => {
todo!();
}
};
}
::ichika::anyhow::Ok(())
}
});
#target_step_pods_ident.push(ThreadPod::new(#target_step_ident::id(), thread));
}
let prev_pods_size = prev_pods_size + #target_step_pods_ident.len();
})
}