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