pub_sub_client_derive/
lib.rs

1use proc_macro::TokenStream;
2use proc_macro2::Span;
3use quote::quote;
4use syn::{parse_macro_input, Data, DeriveInput, Error, Ident};
5
6#[proc_macro_derive(PublishedMessage)]
7pub fn message_macro_derive(input: TokenStream) -> TokenStream {
8    let derive_input = parse_macro_input!(input as DeriveInput);
9
10    match derive_input.data {
11        Data::Union(_) => no_union(),
12        _ => impl_published_message(derive_input.ident),
13    }
14}
15
16fn no_union() -> TokenStream {
17    let e = Error::new(
18        Span::call_site(),
19        "pub-sub-client and Serde do not support derive for unions",
20    );
21    let e = e.to_compile_error();
22    quote!(#e).into()
23}
24
25fn impl_published_message(name: Ident) -> TokenStream {
26    quote!(impl PublishedMessage for #name {}).into()
27}