use crate::{fields::*, *};
pub struct Enum {
pub attributes: Vec<Attribute>,
pub visibility: Visibility,
pub ident: Ident,
pub generics: Generics,
pub variants: Vec<Variant>,
}
impl Enum {
pub fn new(input: syn::DeriveInput) -> Self {
let variants;
if let syn::Data::Enum(new_input) = input.data {
variants = Vec::from_iter(new_input.variants.into_iter());
} else {
panic!("Enum struct can only be used to parse enums!");
}
Self {
attributes: input.attrs,
visibility: input.vis,
ident: input.ident,
generics: input.generics,
variants,
}
}
}
pub struct EnumUnitVariant {
pub attributes: Vec<Attribute>,
pub identifier: Ident,
}
impl EnumUnitVariant {
pub fn new(variant: Variant) -> Self {
Self {
attributes: variant.attrs,
identifier: variant.ident,
}
}
}
pub struct EnumVariantWithUnnamedFields {
pub attributes: Vec<Attribute>,
pub identifier: Ident,
pub fields: Vec<UnnamedField>,
}
impl EnumVariantWithUnnamedFields {
pub fn new(variant: Variant) -> Self {
let mut fields = Vec::new();
for field in variant.fields {
fields.push(UnnamedField::new(field))
}
Self {
attributes: variant.attrs,
identifier: variant.ident,
fields,
}
}
}
pub struct EnumVariantWithNamedFields {
pub attributes: Vec<Attribute>,
pub identifier: Ident,
pub fields: Vec<NamedField>,
}
impl EnumVariantWithNamedFields {
pub fn new(variant: Variant) -> Self {
let mut fields = Vec::new();
for field in variant.fields {
fields.push(NamedField::new(field))
}
Self {
attributes: variant.attrs,
identifier: variant.ident,
fields,
}
}
}
pub struct EnumVariantWithUnitFields {
pub attributes: Vec<Attribute>,
pub identifier: Ident,
pub fields: Vec<UnitField>,
}
impl EnumVariantWithUnitFields {
pub fn new(variant: Variant) -> Self {
let mut fields = Vec::new();
for field in variant.fields {
fields.push(UnitField::new(field))
}
Self {
attributes: variant.attrs,
identifier: variant.ident,
fields,
}
}
}