use proc_macro::TokenStream;
use quote::quote;
use syn::{ItemFn, parse_macro_input};
pub(crate) fn logger_impl(attr: TokenStream, item: TokenStream) -> TokenStream {
let input = parse_macro_input!(item as ItemFn);
let ItemFn {
sig,
vis,
block,
attrs,
} = input;
let statements = block.stmts;
let function_identifier = if attr.to_string().is_empty() {
sig.ident.clone().to_string()
} else {
attr.to_string()
};
quote!(
#(#attrs)*
#vis #sig {
let __binding = LOGGER;
let mut __log = __binding.borrow_mut();
__log.set_fn_name(#function_identifier);
#(#statements)*
}
)
.into()
}