@@ -37,7 +37,7 @@ pub(super) enum ParseDataType {
3737 variants : Vec < LitStr >
3838 } ,
3939 Alternatives {
40- alts : Vec < ParseData >
40+ alts : Vec < TypeOrInline >
4141 } ,
4242 Unit
4343}
@@ -142,7 +142,7 @@ pub(super) fn parse_struct(ident: &Ident, strukt: &DataStruct, attrs: &Container
142142
143143pub ( super ) fn parse_enum ( ident : & Ident , inum : & DataEnum , attrs : & ContainerAttributes ) -> syn:: Result < ParseData > {
144144 let mut strings: Vec < LitStr > = Vec :: new ( ) ;
145- let mut types: Vec < ( LitStr , ParseData ) > = Vec :: new ( ) ;
145+ let mut types: Vec < ( LitStr , TypeOrInline ) > = Vec :: new ( ) ;
146146
147147 for v in & inum. variants {
148148 let name = v. ident . to_lit_str ( ) ;
@@ -151,34 +151,24 @@ pub(super) fn parse_enum(ident: &Ident, inum: &DataEnum, attrs: &ContainerAttrib
151151 let fields = parse_named_fields ( named_fields, attrs. rename_all . as_ref ( ) ) ?;
152152 let struct_name = format ! ( "{ident}::{}" , name. value( ) ) ;
153153 // TODO add documentation here
154- types. push ( ( name, ParseData {
155- name : Some ( struct_name. to_lit_str ( ) ) ,
156- doc : Vec :: new ( ) ,
157- ty : ParseDataType :: Struct {
158- fields,
159- // serde seems to only allow this attribute on the outer
160- // container, not on a per-variant basis
161- deny_unknown_fields : attrs. deny_unknown_fields
162- }
163- } ) ) ;
154+ types. push ( (
155+ name,
156+ TypeOrInline :: Inline ( ParseData {
157+ name : Some ( struct_name. to_lit_str ( ) ) ,
158+ doc : Vec :: new ( ) ,
159+ ty : ParseDataType :: Struct {
160+ fields,
161+ // serde seems to only allow this attribute on the outer
162+ // container, not on a per-variant basis
163+ deny_unknown_fields : attrs. deny_unknown_fields
164+ }
165+ } )
166+ ) ) ;
164167 } ,
165168 Fields :: Unnamed ( unnamed_fields) if unnamed_fields. unnamed . len ( ) == 1 => {
166- let struct_name = format ! ( "{ident}::{}" , name. value( ) ) ;
167169 let ty = unnamed_fields. unnamed . first ( ) . unwrap ( ) . ty . clone ( ) ;
168170 // TODO add documentation here
169- types. push ( ( name. clone ( ) , ParseData {
170- name : Some ( struct_name. to_lit_str ( ) ) ,
171- doc : Vec :: new ( ) ,
172- ty : ParseDataType :: Struct {
173- fields : vec ! [ ParseDataField {
174- name,
175- doc: Vec :: new( ) ,
176- ty: TypeOrInline :: Type ( Box :: new( ty) ) ,
177- flatten: false
178- } ] ,
179- deny_unknown_fields : attrs. deny_unknown_fields
180- }
181- } ) ) ;
171+ types. push ( ( name, TypeOrInline :: Type ( Box :: new ( ty) ) ) ) ;
182172 } ,
183173 Fields :: Unnamed ( unnamed_fields) => {
184174 return Err ( syn:: Error :: new (
@@ -231,27 +221,27 @@ pub(super) fn parse_enum(ident: &Ident, inum: &DataEnum, attrs: &ContainerAttrib
231221 // externally tagged (default)
232222 ( None , None , false ) => {
233223 let struct_name = format ! ( "{ident}::{}::ExtTagWrapper" , name. value( ) ) ;
234- ParseData {
224+ TypeOrInline :: Inline ( ParseData {
235225 name : Some ( struct_name. to_lit_str ( ) ) ,
236226 doc : Vec :: new ( ) ,
237227 ty : ParseDataType :: Struct {
238228 fields : vec ! [ ParseDataField {
239229 name,
240230 doc: Vec :: new( ) ,
241- ty: TypeOrInline :: Inline ( data) ,
231+ ty: data,
242232 flatten: false
243233 } ] ,
244234 deny_unknown_fields : true
245235 }
246- }
236+ } )
247237 } ,
248238 // internally tagged
249239 ( Some ( tag) , None , false ) => {
250240 match & mut data {
251- ParseData {
241+ TypeOrInline :: Inline ( ParseData {
252242 ty : ParseDataType :: Struct { fields, .. } ,
253243 ..
254- } => fields. push ( ParseDataField {
244+ } ) => fields. push ( ParseDataField {
255245 name : tag. clone ( ) ,
256246 doc : Vec :: new ( ) ,
257247 ty : TypeOrInline :: Inline ( ParseData {
@@ -271,7 +261,7 @@ pub(super) fn parse_enum(ident: &Ident, inum: &DataEnum, attrs: &ContainerAttrib
271261 // adjacently tagged
272262 ( Some ( tag) , Some ( content) , false ) => {
273263 let struct_name = format ! ( "{ident}::{}::AdjTagWrapper" , name. value( ) ) ;
274- ParseData {
264+ TypeOrInline :: Inline ( ParseData {
275265 name : Some ( struct_name. to_lit_str ( ) ) ,
276266 doc : Vec :: new ( ) ,
277267 ty : ParseDataType :: Struct {
@@ -289,13 +279,13 @@ pub(super) fn parse_enum(ident: &Ident, inum: &DataEnum, attrs: &ContainerAttrib
289279 ParseDataField {
290280 name: content. clone( ) ,
291281 doc: Vec :: new( ) ,
292- ty: TypeOrInline :: Inline ( data) ,
282+ ty: data,
293283 flatten: false
294284 } ,
295285 ] ,
296286 deny_unknown_fields : true
297287 }
298- }
288+ } )
299289 } ,
300290 // untagged
301291 ( None , None , true ) => data,
@@ -322,10 +312,13 @@ pub(super) fn parse_enum(ident: &Ident, inum: &DataEnum, attrs: &ContainerAttrib
322312 ty : ParseDataType :: Alternatives { mut alts } ,
323313 ..
324314 } )
325- ) if alts. len ( ) == 1 => Ok ( ParseData {
315+ ) if alts. len ( ) == 1 && matches ! ( alts . first ( ) . unwrap ( ) , TypeOrInline :: Inline ( .. ) ) => Ok ( ParseData {
326316 name : Some ( ident. to_lit_str ( ) ) ,
327317 doc : attrs. doc . clone ( ) ,
328- ty : alts. remove ( 0 ) . ty
318+ ty : match alts. remove ( 0 ) {
319+ TypeOrInline :: Inline ( data) => data. ty ,
320+ _ => unreachable ! ( ) // if condition above
321+ }
329322 } ) ,
330323 // only variants with fields
331324 ( None , Some ( data) ) => Ok ( data) ,
@@ -336,11 +329,11 @@ pub(super) fn parse_enum(ident: &Ident, inum: &DataEnum, attrs: &ContainerAttrib
336329 // data_types always produces Alternatives
337330 _ => unreachable ! ( )
338331 } ;
339- alts. push ( ParseData {
332+ alts. push ( TypeOrInline :: Inline ( ParseData {
340333 name : None ,
341334 doc : Vec :: new ( ) ,
342335 ty : data_strings
343- } ) ;
336+ } ) ) ;
344337 Ok ( data_types)
345338 } ,
346339 // no variants
0 commit comments