mini_tokio_attr/
attr.rs

1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{parse_macro_input, ItemFn, ReturnType, Signature};
4
5#[proc_macro_attribute]
6pub fn main(_attr: TokenStream, item: TokenStream) -> TokenStream {
7    let ItemFn { attrs, vis, sig, block } = parse_macro_input!(item);
8    let Signature { ident, generics, inputs, output, .. } = sig;
9
10    let return_type = match output {
11        ReturnType::Default => quote! { () },
12        ReturnType::Type(_, ty) => quote! { #ty },
13    };
14
15    let gen = quote! {
16        #(#attrs)*
17        #vis fn #ident #generics(#inputs) -> #return_type {
18            let rt = ::mini_tokio::Runtime::new();
19            rt.block_on(async {
20                #block
21            });
22        }
23    };
24
25    gen.into()
26}