typhoon_discriminator_macro/
lib.rs1use {
2 proc_macro::TokenStream,
3 quote::{quote, ToTokens},
4 syn::{parse::Parse, parse_macro_input, LitStr},
5 typhoon_discriminator::DiscriminatorBuilder,
6};
7
8#[proc_macro]
9pub fn discriminator(item: TokenStream) -> TokenStream {
10 parse_macro_input!(item as Discriminator)
11 .to_token_stream()
12 .into()
13}
14
15struct Discriminator([u8; 8]);
16
17impl Parse for Discriminator {
18 fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
19 let name: LitStr = input.parse()?;
20
21 let dis = DiscriminatorBuilder::new(&name.value()).build();
22
23 Ok(Discriminator(dis))
24 }
25}
26
27impl ToTokens for Discriminator {
28 fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
29 let discriminator = self.0;
30
31 let t = quote!([#(#discriminator),*]);
32 t.to_tokens(tokens);
33 }
34}