bevis_derive/
lib.rs

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
18// derive of Absorb
19use absorb::impl_absorb;
20
21// derive of Transcript
22use transcript::impl_transcript;
23
24// derieve of Challenge
25use 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}