extern crate proc_macro;
use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, ItemFn};
#[proc_macro_attribute]
pub fn timer(_attr: TokenStream, item: TokenStream) -> TokenStream {
let input = parse_macro_input!(item as ItemFn);
let attrs = input.attrs;
let vis = input.vis;
let sig = input.sig;
let fn_name = sig.ident.to_string();
let inputs = sig.inputs.clone();
let output = sig.output.clone();
let block = input.block;
let result = quote! {
#(#attrs)* #vis #sig {
let start = std::time::Instant::now();
let result = (|| #block)();
let duration = start.elapsed();
println!("{} => Execution time: {:?}", #fn_name, duration);
result
}
};
result.into()
}