1use std::vec;
2
3use proc_macro2::{Ident, TokenStream};
4
5use quote::{format_ident, quote};
6
7use syn::spanned::Spanned;
8use syn::{
9 parse::{Parse, ParseStream},
10 parse_macro_input, parse_quote, Data, DeriveInput, Fields, GenericParam, Generics, Index,
11 Token,
12};
13
14mod absorb;
15mod challenge;
16mod transcript;
17
18use absorb::impl_absorb;
20
21use transcript::impl_transcript;
23
24use challenge::impl_challenge;
26
27struct SpongeType(Vec<Ident>);
28
29impl Parse for SpongeType {
30 fn parse(input: ParseStream) -> Result<Self, syn::Error> {
31 let content;
32 syn::parenthesized!(content in input);
33
34 let mut types = vec![content.parse()?];
35
36 while !content.is_empty() {
37 content.parse::<Token![,]>()?;
38 types.push(content.parse()?);
39 }
40
41 Ok(Self(types))
42 }
43}
44
45#[proc_macro_derive(Tx)]
46pub fn derive_transcript(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
47 impl_transcript(input)
48}
49
50#[proc_macro_derive(Absorb)]
51pub fn derive_absorb(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
52 let ast = parse_macro_input!(input as syn::DeriveInput);
53 impl_absorb(&ast)
54}
55
56#[proc_macro_derive(Challenge)]
57pub fn derive_challenge(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
58 let ast = parse_macro_input!(input as syn::DeriveInput);
59 impl_challenge(&ast)
60}