log_execution_time/
lib.rs1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use quote::quote;
5use syn::{parse_macro_input, ItemFn};
6
7#[proc_macro_attribute]
27pub fn log_execution_time(_attr: TokenStream, item: TokenStream) -> TokenStream {
28 let input = parse_macro_input!(item as ItemFn);
29
30 let func_name = &input.sig.ident;
31 let block = &input.block;
32 let visibility = &input.vis;
33 let sig = &input.sig;
34
35 let expanded = quote! {
36 #visibility #sig {
37 let start = std::time::Instant::now();
38 let result = (|| #block)();
39 let duration = start.elapsed();
40 log::info!("Execution time of `{}`: {:.2?}", stringify!(#func_name), duration);
41 result
42 }
43 };
44
45 TokenStream::from(expanded)
46}