async_metronome_attributes/
lib.rs1use 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}