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}