async_metronome_attributes/
lib.rs

1use proc_macro::TokenStream;
2use proc_macro_error::proc_macro_error;
3use quote::quote;
4use syn::spanned::Spanned;
5
6#[proc_macro_attribute]
7#[proc_macro_error]
8pub fn test(_attr: TokenStream, item: TokenStream) -> TokenStream {
9    let input = syn::parse_macro_input!(item as syn::ItemFn);
10
11    let ret = &input.sig.output;
12    let name = &input.sig.ident;
13    let body = &input.block;
14    let attrs = &input.attrs;
15    let vis = &input.vis;
16
17    if input.sig.asyncness.is_none() {
18        proc_macro_error::abort!(input.span(), "the function must be declared as 'async'");
19    }
20
21    let result = quote! {
22        #[test]
23        #(#attrs)*
24        #vis fn #name() #ret {
25            async_metronome::run(async {
26                #body
27            });
28        }
29    };
30
31    result.into()
32}