use crate::prelude::*;
mod attributes;
mod body;
mod data_type;
mod generics;
mod utils;
mod visibility;
pub use self::attributes::Attribute;
pub use self::attributes::AttributeAccess;
pub use self::attributes::AttributeLocation;
pub use self::attributes::FromAttribute;
pub use self::body::EnumBody;
pub use self::body::EnumVariant;
pub use self::body::Fields;
pub use self::body::IdentOrIndex;
pub use self::body::StructBody;
pub use self::body::UnnamedField;
pub(crate) use self::data_type::DataType;
pub use self::generics::ConstGeneric;
pub use self::generics::Generic;
pub use self::generics::GenericConstraints;
pub use self::generics::Generics;
pub use self::generics::Lifetime;
pub use self::generics::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 {
| Self::Struct {
name,
generics,
generic_constraints,
body,
attributes,
..
} => {
(
Generator::new(name, generics, generic_constraints),
attributes,
Body::Struct(body),
)
},
| Self::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),
}