tracing_config_macros/
lib.rs

1#![forbid(unsafe_code)]
2#![warn(missing_docs)]
3#![warn(rustdoc::private_intra_doc_links)]
4#![doc = include_str!("../README.md")]
5
6use proc_macro::TokenStream;
7use quote::quote;
8use syn::{parse_macro_input, ItemFn};
9
10/// todo
11#[proc_macro_attribute]
12pub fn test(_attr: TokenStream, item: TokenStream) -> TokenStream {
13    // Parse the input tokens into a syntax tree
14    let mut org_fn = parse_macro_input!(item as ItemFn);
15
16    // Get the original function name
17    let org_fn_ident: syn::Ident = org_fn.sig.ident.clone();
18    let org_fn_ident_string = org_fn_ident.to_string();
19    let org_fn_ident_span = org_fn_ident.span().clone();
20    org_fn.sig.ident = syn::Ident::new(
21        format!("{org_fn_ident_string}_private").as_ref(),
22        org_fn_ident_span,
23    );
24    let private_fn = &org_fn.sig.ident;
25
26    // Generate the new code
27    let expanded = quote! {
28        fn #org_fn_ident() {
29            tracing_config::init!();
30            #org_fn;
31            #private_fn()
32        }
33    };
34
35    // Convert the expanded code back into a TokenStream
36    TokenStream::from(expanded)
37}