penum 0.1.30

Make enum conform to a given pattern
Documentation
use syn::{
    parse_quote,
    punctuated::{IntoIter, Iter, Punctuated},
    Fields, FieldsNamed, FieldsUnnamed,
};

use crate::factory::{PatComposite, PatFieldKind};

impl From<&Fields> for PatComposite {
    fn from(value: &Fields) -> Self {
        match value {
            Fields::Named(FieldsNamed { named, brace_token }) => PatComposite::Named {
                parameters: parse_quote!(#named),
                delimiter: *brace_token,
            },
            Fields::Unnamed(FieldsUnnamed {
                unnamed,
                paren_token,
            }) => PatComposite::Unnamed {
                parameters: parse_quote!(#unnamed),
                delimiter: *paren_token,
            },
            Fields::Unit => PatComposite::Unit,
        }
    }
}

impl IntoIterator for PatComposite {
    type Item = PatFieldKind;
    type IntoIter = IntoIter<PatFieldKind>;

    fn into_iter(self) -> Self::IntoIter {
        match self {
            PatComposite::Named { parameters, .. } => parameters.into_iter(),
            PatComposite::Unnamed { parameters, .. } => parameters.into_iter(),
            _ => Punctuated::<PatFieldKind, ()>::new().into_iter(),
        }
    }
}

impl<'a> IntoIterator for &'a PatComposite {
    type Item = &'a PatFieldKind;
    type IntoIter = Iter<'a, PatFieldKind>;

    fn into_iter(self) -> Self::IntoIter {
        self.iter()
    }
}