use crate::prelude::*;
pub fn run(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let syn::ItemFn { attrs, vis, sig, block } = syn::parse_macro_input!(item as syn::ItemFn);
let name = &sig.ident;
if sig.asyncness.is_none() {
abort!(sig.fn_token, "The runtime main function must be async.");
}
#[allow(unused_mut)]
let mut init = TokenStream::new();
#[cfg(feature = "logger")]
init.append_all(quote! {
af_core::log::init!();
});
let wrap_result = match &sig.output {
syn::ReturnType::Default => quote! { Result::<_, i32>::Ok(output) },
_ => quote! { output },
};
let run = match sig.inputs.len() {
0 => quote! {
af_core::run(async {
let output = #name().await;
#wrap_result
});
},
_ => quote! {
af_core::run_with(|cancel| async {
let output = #name(cancel).await;
#wrap_result
});
},
};
let result = quote! {
#vis fn main() {
#(#attrs)*
#sig #block
#init
#run
}
};
result.into()
}