analytics_next_macro/
lib.rs1use 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}