penum 0.1.30

Make enum conform to a given pattern
Documentation
use std::str::FromStr;

use proc_macro2::TokenStream;
use quote::ToTokens;

use super::{PatComposite, PatFieldKind, PatFrag};

impl ToTokens for PatFrag {
    fn to_tokens(&self, tokens: &mut TokenStream) {
        self.ident.to_tokens(tokens);
        self.group.to_tokens(tokens);
    }
}

impl ToTokens for PatFieldKind {
    fn to_tokens(&self, tokens: &mut TokenStream) {
        match self {
            PatFieldKind::Field(f) => f.to_tokens(tokens),
            PatFieldKind::Variadic(v) => v.to_tokens(tokens),
            PatFieldKind::Range(r) => r.to_tokens(tokens),
            PatFieldKind::Infer => tokens.extend(TokenStream::from_str("_")),
            PatFieldKind::Nothing => (),
        }
    }
}

impl ToTokens for PatComposite {
    fn to_tokens(&self, tokens: &mut TokenStream) {
        match self {
            PatComposite::Named {
                parameters,
                delimiter,
            } => delimiter.surround(tokens, |tokens| parameters.to_tokens(tokens)),
            PatComposite::Unnamed {
                parameters,
                delimiter,
            } => delimiter.surround(tokens, |tokens| parameters.to_tokens(tokens)),
            _ => (),
        }
    }
}