use proc_macro::TokenStream;
use quote::quote;
use syn::parse::{Parse, ParseStream, Result};
use syn::{parse_macro_input, Expr, Token};
#[proc_macro]
pub fn start_span(_input: TokenStream) -> TokenStream {
quote! {
chronograph::start_threadlocal_span()
}
.into()
}
#[proc_macro]
pub fn record_instant(input: TokenStream) -> TokenStream {
let expr = parse_macro_input!(input as Expr);
quote! {
chronograph::get_threadlocal_span().record_instant(#expr)
}
.into()
}
#[proc_macro]
pub fn record_unix_time(input: TokenStream) -> TokenStream {
let expr = parse_macro_input!(input as Expr);
quote! {
chronograph::get_threadlocal_span().record_unix_time(#expr)
}
.into()
}
struct ValueInput {
id: Expr,
_comma: Token![,],
value: Expr,
}
impl Parse for ValueInput {
fn parse(input: ParseStream) -> Result<Self> {
Ok(ValueInput {
id: input.parse()?,
_comma: input.parse()?,
value: input.parse()?,
})
}
}
#[proc_macro]
pub fn record_value(input: TokenStream) -> TokenStream {
let ValueInput { id, value, .. } = parse_macro_input!(input as ValueInput);
quote! {
chronograph::get_threadlocal_span().record_value(#id, #value)
}
.into()
}
#[proc_macro]
pub fn take_span(_input: TokenStream) -> TokenStream {
quote! {
chronograph::take_threadlocal_span()
}
.into()
}
#[proc_macro]
pub fn end_span(_input: TokenStream) -> TokenStream {
quote! {
chronograph::end_threadlocal_span()
}
.into()
}