typhoon-syn 0.3.0

Syntax tree utilities and helpers for macro processing
Documentation
use {
    quote::ToTokens,
    syn::{parse::Parse, punctuated::Punctuated, Expr, Token},
};

#[derive(Clone)]
pub enum SeedsExpr {
    Punctuated(Punctuated<Expr, Token![,]>),
    Single(Expr),
}

impl Parse for SeedsExpr {
    fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
        let expr: Expr = input.parse()?;

        match expr {
            Expr::Array(array_expr) => {
                let mut elems = array_expr.elems;
                if elems.trailing_punct() {
                    elems.pop_punct();
                }
                Ok(SeedsExpr::Punctuated(elems))
            }
            Expr::Call(_) | Expr::MethodCall(_) => Ok(SeedsExpr::Single(expr)),
            _ => Err(syn::Error::new_spanned(&expr, "Invalid seeds format")),
        }
    }
}

impl ToTokens for SeedsExpr {
    fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
        match self {
            SeedsExpr::Punctuated(punctuated) => punctuated.to_tokens(tokens),
            SeedsExpr::Single(expr) => expr.to_tokens(tokens),
        }
    }
}