use proc_macro2::TokenStream;
use quote::quote;
use syn::ItemFn;
pub fn main_macro(item: TokenStream) -> TokenStream {
let input_fn: ItemFn = match syn::parse2(item) {
Ok(f) => f,
Err(err) => return err.to_compile_error(),
};
if input_fn.sig.asyncness.is_none() {
return syn::Error::new_spanned(input_fn.sig.fn_token, "the main function must be async")
.to_compile_error();
}
let body = &input_fn.block;
let attrs = &input_fn.attrs;
quote! {
#(#attrs)*
fn main() {
unsafe { ::std::env::set_var("AUTUMN_MANIFEST_DIR", env!("CARGO_MANIFEST_DIR")); }
::autumn_web::reexports::tokio::runtime::Builder::new_multi_thread()
.enable_all()
.build()
.expect("failed to build tokio runtime")
.block_on(async move #body);
}
}
}