mini_macro 0.2.0

helper mini macros
Documentation
use proc_macro::TokenStream;
use quote::quote;
use syn::{ItemFn, parse_macro_input};

#[proc_macro_attribute]
pub fn trace_time(_attr: TokenStream, item: TokenStream) -> TokenStream {
    let input = parse_macro_input!(item as ItemFn);
    let fn_name = &input.sig.ident;
    let asyncness = &input.sig.asyncness;
    let inputs = &input.sig.inputs;
    let output = &input.sig.output;
    let block = &input.block;
    let vis = &input.vis;
    let attrs = &input.attrs;

    let expanded = if asyncness.is_some() {
        // 处理异步函数
        quote! {
            #(#attrs)*
            #vis #asyncness fn #fn_name(#inputs) #output {
                let __start = std::time::Instant::now();
                let result = (async move #block).await;
                let duration = __start.elapsed();
                if duration.as_secs() > 5 {
                    tracing::info!(target: "trace_time", "Function `{}` took {:?}", stringify!(#fn_name), duration);
                }
                result
            }
        }
    } else {
        // 处理同步函数
        quote! {
            #(#attrs)*
            #vis fn #fn_name(#inputs) #output {
                let __start = std::time::Instant::now();
                let result = #block;
                let duration = __start.elapsed();
                if duration.as_secs() > 5 {
                    tracing::info!(target: "trace_time", "Function `{}` took {:?}", stringify!(#fn_name), duration);
                }
                result
            }
        }
    };

    TokenStream::from(expanded)
}