1extern crate proc_macro;
2use proc_macro::*;
3
4extern crate syn;
5
6#[proc_macro_attribute]
8pub fn timed(_args: TokenStream, input: TokenStream) -> TokenStream {
9 use std::str::FromStr;
10
11 let fn_name = {
12 let data = input.clone();
13 let tokens = syn::parse_macro_input!(data as syn::ItemFn);
14 tokens.sig.ident.to_string()
15 };
16
17 let mut token_str = input.to_string();
18 token_str.insert_str(token_str.find("{").expect("") + 1,
19 &format!("let __internal_stratus_timer = stratus::Timer::new_with_label(\"{}\");", fn_name));
20 TokenStream::from_str(&token_str).expect("generated invalid tokens")
21}
22
23#[proc_macro_attribute]
24pub fn profiled(_args: TokenStream, input: TokenStream) -> TokenStream {
25 use std::str::FromStr;
26
27 let fn_name = {
28 let data = input.clone();
29 let tokens = syn::parse_macro_input!(data as syn::ItemFn);
30 tokens.sig.ident.to_string()
31 };
32
33 let mut token_str = input.to_string();
34 token_str.insert_str(token_str.find("{").expect("") + 1,
35 &format!("let __internal_stratus_profiler = stratus::Profile::new(\"funcion\".to_string(), \"{}\".to_string());", fn_name));
36 TokenStream::from_str(&token_str).expect("generated invalid tokens")
37}