@@ -1387,36 +1387,45 @@ fn deserialize_internally_tagged_enum(
13871387 let ( variants_stmt, variant_visitor) = prepare_enum_variant_enum ( variants) ;
13881388
13891389 // Match arms to extract a variant from a string
1390- let variant_arms = variants
1390+ let mut variants = variants
13911391 . iter ( )
13921392 . enumerate ( )
1393- . filter ( |& ( _, variant) | !variant. attrs . skip_deserializing ( ) )
1394- . map ( |( i, variant) | {
1395- let variant_name = field_i ( i) ;
1393+ . filter ( |& ( _, variant) | !variant. attrs . skip_deserializing ( ) ) ;
1394+ let variant_arms = variants . clone ( ) . map ( |( i, variant) | {
1395+ let variant_name = field_i ( i) ;
13961396
1397- let block = Match ( deserialize_internally_tagged_variant (
1398- params,
1399- variant,
1400- cattrs,
1401- quote ! ( __deserializer) ,
1402- ) ) ;
1397+ let block = Match ( deserialize_internally_tagged_variant (
1398+ params,
1399+ variant,
1400+ cattrs,
1401+ quote ! ( __deserializer) ,
1402+ ) ) ;
14031403
1404- quote ! {
1405- __Field:: #variant_name => #block
1406- }
1407- } ) ;
1404+ quote ! {
1405+ __Field:: #variant_name => #block
1406+ }
1407+ } ) ;
14081408
14091409 let expecting = format ! ( "internally tagged enum {}" , params. type_name( ) ) ;
14101410 let expecting = cattrs. expecting ( ) . unwrap_or ( & expecting) ;
14111411
1412+ // We check that only one variant is marked with #[serde(default)]
1413+ let default = match variants. find ( |( _, variant) | variant. attrs . default ( ) ) {
1414+ Some ( ( i, _) ) => {
1415+ let default = field_i ( i) ;
1416+ quote ! { _serde:: #private:: Some ( __Field:: #default ) }
1417+ }
1418+ None => quote ! { _serde:: #private:: None } ,
1419+ } ;
1420+
14121421 quote_block ! {
14131422 #variant_visitor
14141423
14151424 #variants_stmt
14161425
14171426 let ( __tag, __content) = _serde:: Deserializer :: deserialize_any(
14181427 __deserializer,
1419- _serde:: #private:: de:: TaggedContentVisitor :: <__Field>:: new( #tag, #expecting) ) ?;
1428+ _serde:: #private:: de:: TaggedContentVisitor :: <__Field>:: new( #tag, #expecting, # default ) ) ?;
14201429 let __deserializer = _serde:: #private:: de:: ContentDeserializer :: <__D:: Error >:: new( __content) ;
14211430
14221431 match __tag {
0 commit comments