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 output.into()
48}