1use crate::prelude::*;
4
5mod attributes;
6mod body;
7mod data_type;
8mod generics;
9mod utils;
10mod visibility;
11
12pub use self::attributes::Attribute;
13pub use self::attributes::AttributeAccess;
14pub use self::attributes::AttributeLocation;
15pub use self::attributes::FromAttribute;
16pub use self::body::EnumBody;
17pub use self::body::EnumVariant;
18pub use self::body::Fields;
19pub use self::body::IdentOrIndex;
20pub use self::body::StructBody;
21pub use self::body::UnnamedField;
22pub(crate) use self::data_type::DataType;
23pub use self::generics::ConstGeneric;
24pub use self::generics::Generic;
25pub use self::generics::GenericConstraints;
26pub use self::generics::Generics;
27pub use self::generics::Lifetime;
28pub use self::generics::SimpleGeneric;
29pub use self::visibility::Visibility;
30
31use crate::generate::Generator;
32
33#[non_exhaustive]
48pub enum Parse {
49 Struct {
51 attributes: Vec<Attribute>,
53 visibility: Visibility,
55 name: Ident,
57 generics: Option<Generics>,
59 generic_constraints: Option<GenericConstraints>,
61 body: StructBody,
63 },
64 Enum {
66 attributes: Vec<Attribute>,
68 visibility: Visibility,
70 name: Ident,
72 generics: Option<Generics>,
74 generic_constraints: Option<GenericConstraints>,
76 body: EnumBody,
78 },
79}
80
81impl Parse {
82 pub fn new(input: TokenStream) -> Result<Self> {
88 let source = &mut input.into_iter().peekable();
89
90 let attributes = Attribute::try_take(AttributeLocation::Container, source)?;
91 let visibility = Visibility::try_take(source)?;
92 let (datatype, name) = DataType::take(source)?;
93 let generics = Generics::try_take(source)?;
94 let generic_constraints = GenericConstraints::try_take(source)?;
95 match datatype {
96 | DataType::Struct => {
97 let body = StructBody::take(source)?;
98 Ok(Self::Struct {
99 attributes,
100 visibility,
101 name,
102 generics,
103 generic_constraints,
104 body,
105 })
106 },
107 | DataType::Enum => {
108 let body = EnumBody::take(source)?;
109 Ok(Self::Enum {
110 attributes,
111 visibility,
112 name,
113 generics,
114 generic_constraints,
115 body,
116 })
117 },
118 }
119 }
120
121 pub fn into_generator(self) -> (Generator, Vec<Attribute>, Body) {
123 match self {
124 | Self::Struct {
125 name,
126 generics,
127 generic_constraints,
128 body,
129 attributes,
130 ..
131 } => {
132 (
133 Generator::new(name, generics, generic_constraints),
134 attributes,
135 Body::Struct(body),
136 )
137 },
138 | Self::Enum {
139 name,
140 generics,
141 generic_constraints,
142 body,
143 attributes,
144 ..
145 } => {
146 (
147 Generator::new(name, generics, generic_constraints),
148 attributes,
149 Body::Enum(body),
150 )
151 },
152 }
153 }
154}
155
156#[allow(missing_docs)]
158pub enum Body {
159 Struct(StructBody),
160 Enum(EnumBody),
161}