typhoon_syn/utils/
seeds_expr.rs1use {
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}