instrumenter_proc_macro/
lib.rs

1#![allow(warnings)]
2
3use proc_macro::TokenStream;
4#[cfg(feature = "enabled")]
5use proc_macro2::TokenStream as TokenStream2;
6#[cfg(feature = "enabled")]
7use quote::quote;
8#[cfg(feature = "enabled")]
9use syn::{parse_macro_input, parse_quote, ItemFn};
10
11#[proc_macro_attribute]
12pub fn track(args: TokenStream, input: TokenStream) -> TokenStream {
13    #[cfg(feature = "enabled")]
14    {
15        let mut function = parse_macro_input!(input as ItemFn);
16        let args = TokenStream2::from(args);
17
18        function
19            .attrs
20            .push(parse_quote!(#[instrumenter::private__::instrument(skip_all, #args)]));
21        function.block.stmts.insert(
22            0,
23            parse_quote!(
24                use instrumenter::private__ as tracing;
25            ),
26        );
27
28        TokenStream::from(quote! {
29            #function
30        })
31    }
32
33    #[cfg(not(feature = "enabled"))]
34    input
35}