analytics_next_macro/
lib.rs

1use proc_macro::TokenStream;
2use proc_macro2::Span;
3use quote::quote;
4use syn::{parse_macro_input, GenericParam, Lifetime, LifetimeParam, LitStr};
5
6#[proc_macro_attribute]
7pub fn tracking(attr: TokenStream, input: TokenStream) -> TokenStream {
8    let attr = parse_macro_input!(attr as LitStr);
9
10    let ast: syn::DeriveInput = syn::parse(input.clone()).unwrap();
11    let input = proc_macro2::TokenStream::from(input);
12
13    let name = &ast.ident;
14
15    let mut gen_clone = ast.generics.clone();
16    let lt = Lifetime::new("'event", Span::call_site());
17    let ltp = LifetimeParam::new(lt);
18    gen_clone.params.push(GenericParam::from(ltp));
19    let (impl_generics2, _, _) = gen_clone.split_for_impl();
20    let (_, ty_generics, where_clause) = ast.generics.split_for_impl();
21
22    let gen = quote!(
23        impl #impl_generics2 From<#name #ty_generics> for analytics_next::TrackingEvent<'event> #where_clause {
24            fn from(value: #name #ty_generics) -> Self {
25                (#attr, serde_json::to_value(&value).ok()).into()
26            }
27        }
28
29        #input
30    );
31
32    gen.into()
33}