hala_pprof_derive/
lib.rs

1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{parse::Parse, parse_macro_input, Ident, ItemFn, LitStr, Token};
4use uuid::Uuid;
5
6struct TargetInput {
7    ident: Ident,
8    #[allow(unused)]
9    token: Token![,],
10    doc: LitStr,
11}
12
13impl Parse for TargetInput {
14    fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
15        Ok(Self {
16            ident: input.parse()?,
17            token: input.parse()?,
18            doc: input.parse()?,
19        })
20    }
21}
22
23#[proc_macro]
24pub fn def_target(item: TokenStream) -> TokenStream {
25    let TargetInput {
26        ident,
27        token: _,
28        doc,
29    } = parse_macro_input!(item as TargetInput);
30
31    let uuid = Uuid::new_v4().to_string();
32
33    quote! {
34        #[doc=#doc]
35        pub static #ident: &'static str = #uuid;
36    }
37    .into()
38}
39
40#[proc_macro_attribute]
41pub fn cpu_profiling(_attr: TokenStream, item: TokenStream) -> TokenStream {
42    let ItemFn {
43        attrs,
44        vis,
45        sig,
46        block,
47    } = parse_macro_input!(item as ItemFn);
48
49    quote! {
50        #(#attrs)*
51        #vis #sig {
52            let instant = std::time::Instant::now();
53
54            let r = #block;
55
56            hala_pprof::profiler::cpu_profiler_sample(instant);
57
58            return r
59        }
60    }
61    .into()
62}