use crate::prelude::*;
pub fn run(item: proc_macro::TokenStream, send: bool) -> proc_macro::TokenStream {
let syn::ItemFn { attrs, vis, sig, block } = syn::parse_macro_input!(item as syn::ItemFn);
let syn::Signature { asyncness, unsafety, fn_token, ident, generics, inputs, output, .. } = sig;
if asyncness.is_none() {
abort!(fn_token, "A function must be async to return a boxed future.");
}
let output = match output {
syn::ReturnType::Default => quote! { () },
syn::ReturnType::Type(_, ty) => ty.to_token_stream(),
};
let plus_send = match send {
true => Some(quote! { + Send }),
false => None,
};
let result = quote! {
#(#attrs)*
#vis #unsafety fn #ident #generics (
#inputs
) -> std::pin::Pin<Box<dyn Future<Output = #output> #plus_send>> {
Box::pin(async move #block)
}
};
result.into()
}