game-metrics-macro 0.0.4

Macro crate to support game-metrics
Documentation
#![deny(clippy::pedantic, clippy::all)]
#![allow(
    clippy::must_use_candidate,
    clippy::new_ret_no_self,
    clippy::cast_precision_loss,
    clippy::missing_safety_doc,
    clippy::default_trait_access,
    clippy::module_name_repetitions,
    non_upper_case_globals
)]
extern crate proc_macro;

use crate::proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, parse_quote, AttributeArgs, Item, LitStr, Meta, NestedMeta};

#[cfg(not(feature = "disable"))]
#[proc_macro_attribute]
pub fn instrument(attr: TokenStream, input: TokenStream) -> TokenStream {
    let attrs = parse_macro_input!(attr as AttributeArgs);

    let name = attrs
        .iter()
        .find_map(|attr| {
            if let NestedMeta::Meta(meta) = attr {
                if let Meta::NameValue(kv) = meta {
                    if kv.path.is_ident("name") {
                        if let syn::Lit::Str(s) = &kv.lit {
                            return Some(s.clone());
                        }
                    }
                }
            }
            None
        });

    let inner = parse_macro_input!(input as Item);
    match inner {
        Item::Fn(mut f) => {
            let name = name.unwrap_or(LitStr::new(&f.sig.ident.to_string(), proc_macro2::Span::call_site()));

            let block = f.block;
            f.block = Box::new(parse_quote! {
                {
                    {
                        let __span = game_metrics::Span::new(#name);
                        #block
                    }
                }
            });
            TokenStream::from(quote! { #f })
        }
        _ => panic!("unsupported type for the #[instrument] macro"),
    }
}

#[cfg(feature = "disable")]
#[proc_macro_attribute]
pub fn instrument(attr: TokenStream, input: TokenStream) -> TokenStream {
    input.into()
}