1use proc_macro::TokenStream;
2use syn::{parse_macro_input, ItemFn};
3use quote::quote;
4
5#[proc_macro_attribute]
6pub fn show_streams(attr: TokenStream, item: TokenStream) -> TokenStream {
7 println!("attr: \"{attr}\"");
8 println!("item: \"{item}\"");
9
10 item
11}
12
13#[proc_macro_attribute]
14pub fn compute_time(_attr: TokenStream, item: TokenStream) -> TokenStream {
15 let input = parse_macro_input!(item as ItemFn);
17 let fn_name = &input.sig.ident;
22 let fn_body = &input.block;
23 let fn_visibility = &input.vis;
24 let fn_signature = &input.sig;
25
26 let expanded = quote! {
27 #fn_visibility #fn_signature {
28 let start = std::time::Instant::now();
29
30 #fn_body
31
32 let elapsed = start.elapsed();
33 println!("{} took {:?}", stringify!(#fn_name), elapsed);
34 }
35 };
36
37 expanded.into()
38}
39