timesource_derive/
lib.rs

1mod encoding;
2mod meta;
3
4#[macro_use]
5extern crate quote;
6
7use meta::EventMeta;
8use proc_macro::TokenStream;
9use syn::{parse_macro_input, DeriveInput, Error};
10
11#[proc_macro_derive(TimesourceEvent, attributes(timesource))]
12pub fn timesource_event(input: TokenStream) -> TokenStream {
13    let mut item = parse_macro_input!(input as DeriveInput);
14
15    let timesource_attr = item
16        .attrs
17        .iter()
18        .find(|attr| attr.path.is_ident("timesource"));
19
20    let event_meta = EventMeta::try_from(timesource_attr).unwrap();
21    let ident = &item.ident;
22    let name = ident.to_string();
23
24    let (_impl_generics, ty_generics, where_clause) = item.generics.split_for_impl();
25
26    let output = match &mut item.data {
27        syn::Data::Struct(_) | syn::Data::Enum(_) => {
28            quote! {
29                impl #ty_generics timesource::TimesourceEventPayload for #ident #ty_generics #where_clause {
30                    fn name() -> &'static str {
31                        #name
32                    }
33
34                    #event_meta
35                }
36            }
37        }
38        syn::Data::Union(u) => {
39            return Error::new_spanned(u.union_token, "Unions not supported for TimesourceEvent")
40                .to_compile_error()
41                .into()
42        }
43    };
44
45    // println!("output = {:#}", output);
46
47    output.into()
48}