extern crate proc_macro;
use proc_macro::TokenStream;
use quote::quote;
use syn::{ItemFn, parse_macro_input, parse_quote};
#[proc_macro_attribute]
#[cfg(all(feature = "enable"))]
pub fn profile(_attr: TokenStream, item: TokenStream) -> TokenStream {
let mut function = parse_macro_input!(item as ItemFn);
let body = &function.block;
let new_body: syn::Block = parse_quote! {
{
optick::event!();
#body
}
};
function.block = Box::new(new_body);
(quote! {
#function
})
.into()
}
#[proc_macro_attribute]
#[cfg(all(feature = "enable"))]
pub fn capture(attr: TokenStream, item: TokenStream) -> TokenStream {
let path_arg = attr.to_string();
let path_length = path_arg.len();
let path = if path_length < 2 {
"optick_capture"
} else {
&path_arg[1..path_length-1]
};
let mut function = parse_macro_input!(item as ItemFn);
let body = &function.block;
let new_body: syn::Block = parse_quote! {
{
optick::start_capture();
let result = #body;
optick::stop_capture(#path);
result
}
};
function.block = Box::new(new_body);
(quote! {
#function
})
.into()
}