Skip to main content

typhoon_syn/utils/
seeds_expr.rs

1use {
2    quote::ToTokens,
3    syn::{parse::Parse, punctuated::Punctuated, Expr, Token},
4};
5
6#[derive(Clone)]
7pub enum SeedsExpr {
8    Punctuated(Punctuated<Expr, Token![,]>),
9    Single(Expr),
10}
11
12impl Parse for SeedsExpr {
13    fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
14        let expr: Expr = input.parse()?;
15
16        match expr {
17            Expr::Array(array_expr) => {
18                let mut elems = array_expr.elems;
19                if elems.trailing_punct() {
20                    elems.pop_punct();
21                }
22                Ok(SeedsExpr::Punctuated(elems))
23            }
24            Expr::Call(_) | Expr::MethodCall(_) => Ok(SeedsExpr::Single(expr)),
25            _ => Err(syn::Error::new_spanned(&expr, "Invalid seeds format")),
26        }
27    }
28}
29
30impl ToTokens for SeedsExpr {
31    fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
32        match self {
33            SeedsExpr::Punctuated(punctuated) => punctuated.to_tokens(tokens),
34            SeedsExpr::Single(expr) => expr.to_tokens(tokens),
35        }
36    }
37}