analytics-next-macro 0.1.6

Derive to create tracking events for analytics-next
Documentation
use proc_macro::TokenStream;
use proc_macro2::Span;
use quote::quote;
use syn::{parse_macro_input, GenericParam, Lifetime, LifetimeParam, LitStr};

#[proc_macro_attribute]
pub fn tracking(attr: TokenStream, input: TokenStream) -> TokenStream {
    let attr = parse_macro_input!(attr as LitStr);

    let ast: syn::DeriveInput = syn::parse(input.clone()).unwrap();
    let input = proc_macro2::TokenStream::from(input);

    let name = &ast.ident;

    let mut gen_clone = ast.generics.clone();
    let lt = Lifetime::new("'event", Span::call_site());
    let ltp = LifetimeParam::new(lt);
    gen_clone.params.push(GenericParam::from(ltp));
    let (impl_generics2, _, _) = gen_clone.split_for_impl();
    let (_, ty_generics, where_clause) = ast.generics.split_for_impl();

    let gen = quote!(
        impl #impl_generics2 From<#name #ty_generics> for analytics_next::TrackingEvent<'event> #where_clause {
            fn from(value: #name #ty_generics) -> Self {
                (#attr, serde_json::to_value(&value).ok()).into()
            }
        }

        #input
    );

    gen.into()
}