#![deny(missing_docs)]
extern crate syn;
use proc_macro::TokenStream;
use quote::quote;
use syn::parse::Parse;
use syn::parse::ParseStream;
use syn::parse_macro_input;
use syn::parse_quote;
use syn::ItemFn;
use syn::LitStr;
use syn::Result;
use syn::Stmt;
struct ScopeName {
string: LitStr,
}
impl Parse for ScopeName {
fn parse(stream: ParseStream) -> Result<Self> {
Ok(Self {
string: stream.parse()?,
})
}
}
#[proc_macro_attribute]
pub fn scope(attributes: TokenStream, stream: TokenStream) -> TokenStream {
let mut input = parse_macro_input!(stream as ItemFn);
let name = if attributes.is_empty() {
input.sig.ident.to_string()
} else {
parse_macro_input!(attributes as ScopeName).string.value()
};
let prefix: Stmt = parse_quote! { let _loggy_scope = loggy::Scope::new(#name); };
input.block.stmts.insert(0, prefix);
let output = quote! { #input };
output.into()
}