typhoon_discriminator_macro/
lib.rs

1use {
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}