log_time/
lib.rs

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    // The parse_macro_input! macro is used to parse the input tokens into an ItemFn, which represents a function.
16    let input = parse_macro_input!(item as ItemFn);
17    // fn_name: The name of the function.
18    // fn_body: The body of the function.
19    // fn_visibility: The visibility (e.g., pub).
20    // fn_signature: The function signature.
21    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