use crate::prelude::*;
mod attributes;
mod body;
mod data_type;
mod generics;
mod utils;
mod visibility;
pub use self::attributes::{Attribute, AttributeAccess, AttributeLocation, FromAttribute};
pub use self::body::{EnumBody, EnumVariant, Fields, IdentOrIndex, StructBody, UnnamedField};
pub(crate) use self::data_type::DataType;
pub use self::generics::{
ConstGeneric, Generic, GenericConstraints, Generics, Lifetime, SimpleGeneric,
};
pub use self::visibility::Visibility;
use crate::generate::Generator;
#[non_exhaustive]
pub enum Parse {
Struct {
attributes: Vec<Attribute>,
visibility: Visibility,
name: Ident,
generics: Option<Generics>,
generic_constraints: Option<GenericConstraints>,
body: StructBody,
},
Enum {
attributes: Vec<Attribute>,
visibility: Visibility,
name: Ident,
generics: Option<Generics>,
generic_constraints: Option<GenericConstraints>,
body: EnumBody,
},
}
impl Parse {
pub fn new(input: TokenStream) -> Result<Self> {
let source = &mut input.into_iter().peekable();
let attributes = Attribute::try_take(AttributeLocation::Container, source)?;
let visibility = Visibility::try_take(source)?;
let (datatype, name) = DataType::take(source)?;
let generics = Generics::try_take(source)?;
let generic_constraints = GenericConstraints::try_take(source)?;
match datatype {
DataType::Struct => {
let body = StructBody::take(source)?;
Ok(Self::Struct {
attributes,
visibility,
name,
generics,
generic_constraints,
body,
})
}
DataType::Enum => {
let body = EnumBody::take(source)?;
Ok(Self::Enum {
attributes,
visibility,
name,
generics,
generic_constraints,
body,
})
}
}
}
pub fn into_generator(self) -> (Generator, Vec<Attribute>, Body) {
match self {
Parse::Struct {
name,
generics,
generic_constraints,
body,
attributes,
..
} => (
Generator::new(name, generics, generic_constraints),
attributes,
Body::Struct(body),
),
Parse::Enum {
name,
generics,
generic_constraints,
body,
attributes,
..
} => (
Generator::new(name, generics, generic_constraints),
attributes,
Body::Enum(body),
),
}
}
}
#[allow(missing_docs)]
pub enum Body {
Struct(StructBody),
Enum(EnumBody),
}