use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, ItemFn, ReturnType};
#[proc_macro_attribute]
pub fn run(_attr: TokenStream, item: TokenStream) -> TokenStream {
let mut func = parse_macro_input!(item as ItemFn);
if let Some(async_token) = &func.sig.asyncness {
return syn::Error::new_spanned(
async_token,
"#[go_lib::run] does not support async functions; \
go-lib provides its own M:N scheduler",
)
.to_compile_error()
.into();
}
let return_type = func.sig.output.clone();
let body = &*func.block;
let run_call = match &return_type {
ReturnType::Default => quote! {
go_lib::run(move || #body)
},
ReturnType::Type(_, ty) => quote! {
go_lib::run(move || -> #ty #body)
},
};
func.block = syn::parse_quote! { { #run_call } };
quote! { #func }.into()
}