stratus_macros/
lib.rs

1extern crate proc_macro;
2use proc_macro::*;
3
4extern crate syn;
5
6//TODO: either move away from syn or commit to syn, don't use both string parsing and syn
7#[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}