log_execution_time/
lib.rs

1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use quote::quote;
5use syn::{parse_macro_input, ItemFn};
6
7/// A procedural macro to log the execution time of a function.
8///
9/// # Usage
10///
11/// Add `#[log_execution_time]` above a function to log its execution duration.
12/// The macro uses the `log` crate to log the timing information.
13///
14/// # Example
15///
16/// ```rust
17/// use your_crate_name::log_execution_time;
18///
19/// #[log_execution_time]
20/// fn example_function() {
21///     // Your code here
22/// }
23/// ```
24///
25/// When `example_function` is called, its execution time will be logged.
26#[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}