@@ -341,6 +341,7 @@ impl<'a, 'de> DeserializeSeed<'de> for TypedReflectDeserializer<'a> {
341341                    struct_info. field_names ( ) , 
342342                    StructVisitor  { 
343343                        struct_info, 
344+                         registration :  self . registration , 
344345                        registry :  self . registry , 
345346                    } , 
346347                ) ?; 
@@ -411,6 +412,7 @@ impl<'a, 'de> DeserializeSeed<'de> for TypedReflectDeserializer<'a> {
411412                        enum_info. variant_names ( ) , 
412413                        EnumVisitor  { 
413414                            enum_info, 
415+                             registration :  self . registration , 
414416                            registry :  self . registry , 
415417                        } , 
416418                    ) ?
@@ -439,6 +441,7 @@ impl<'a, 'de> DeserializeSeed<'de> for TypedReflectDeserializer<'a> {
439441
440442struct  StructVisitor < ' a >  { 
441443    struct_info :  & ' static  StructInfo , 
444+     registration :  & ' a  TypeRegistration , 
442445    registry :  & ' a  TypeRegistry , 
443446} 
444447
@@ -463,6 +466,18 @@ impl<'a, 'de> Visitor<'de> for StructVisitor<'a> {
463466        let  mut  index = 0usize ; 
464467        let  mut  output = DynamicStruct :: default ( ) ; 
465468
469+         let  ignored_len = self 
470+             . registration 
471+             . data :: < SerializationData > ( ) 
472+             . map ( |data| data. len ( ) ) 
473+             . unwrap_or ( 0 ) ; 
474+         let  field_len = self . struct_info . field_len ( ) . saturating_sub ( ignored_len) ; 
475+ 
476+         if  field_len == 0  { 
477+             // Handle unit structs and ignored fields 
478+             return  Ok ( output) ; 
479+         } 
480+ 
466481        while  let  Some ( value)  = seq. next_element_seed ( TypedReflectDeserializer  { 
467482            registration :  self 
468483                . struct_info 
@@ -501,6 +516,21 @@ impl<'a, 'de> Visitor<'de> for TupleStructVisitor<'a> {
501516        let  mut  index = 0usize ; 
502517        let  mut  tuple_struct = DynamicTupleStruct :: default ( ) ; 
503518
519+         let  ignored_len = self 
520+             . registration 
521+             . data :: < SerializationData > ( ) 
522+             . map ( |data| data. len ( ) ) 
523+             . unwrap_or ( 0 ) ; 
524+         let  field_len = self 
525+             . tuple_struct_info 
526+             . field_len ( ) 
527+             . saturating_sub ( ignored_len) ; 
528+ 
529+         if  field_len == 0  { 
530+             // Handle unit structs and ignored fields 
531+             return  Ok ( tuple_struct) ; 
532+         } 
533+ 
504534        let  get_field_registration = |index :  usize | -> Result < & ' a  TypeRegistration ,  V :: Error >  { 
505535            let  field = self . tuple_struct_info . field_at ( index) . ok_or_else ( || { 
506536                de:: Error :: custom ( format_args ! ( 
@@ -675,6 +705,7 @@ impl<'a, 'de> Visitor<'de> for MapVisitor<'a> {
675705
676706struct  EnumVisitor < ' a >  { 
677707    enum_info :  & ' static  EnumInfo , 
708+     registration :  & ' a  TypeRegistration , 
678709    registry :  & ' a  TypeRegistry , 
679710} 
680711
@@ -701,6 +732,7 @@ impl<'a, 'de> Visitor<'de> for EnumVisitor<'a> {
701732                    struct_info. field_names ( ) , 
702733                    StructVariantVisitor  { 
703734                        struct_info, 
735+                         registration :  self . registration , 
704736                        registry :  self . registry , 
705737                    } , 
706738                ) ?
@@ -722,6 +754,7 @@ impl<'a, 'de> Visitor<'de> for EnumVisitor<'a> {
722754                    tuple_info. field_len ( ) , 
723755                    TupleVariantVisitor  { 
724756                        tuple_info, 
757+                         registration :  self . registration , 
725758                        registry :  self . registry , 
726759                    } , 
727760                ) ?
@@ -787,6 +820,7 @@ impl<'de> DeserializeSeed<'de> for VariantDeserializer {
787820
788821struct  StructVariantVisitor < ' a >  { 
789822    struct_info :  & ' static  StructVariantInfo , 
823+     registration :  & ' a  TypeRegistration , 
790824    registry :  & ' a  TypeRegistry , 
791825} 
792826
@@ -811,6 +845,18 @@ impl<'a, 'de> Visitor<'de> for StructVariantVisitor<'a> {
811845        let  mut  index = 0usize ; 
812846        let  mut  output = DynamicStruct :: default ( ) ; 
813847
848+         let  ignored_len = self 
849+             . registration 
850+             . data :: < SerializationData > ( ) 
851+             . map ( |data| data. len ( ) ) 
852+             . unwrap_or ( 0 ) ; 
853+         let  field_len = self . struct_info . field_len ( ) . saturating_sub ( ignored_len) ; 
854+ 
855+         if  field_len == 0  { 
856+             // Handle all fields being ignored 
857+             return  Ok ( output) ; 
858+         } 
859+ 
814860        while  let  Some ( value)  = seq. next_element_seed ( TypedReflectDeserializer  { 
815861            registration :  self 
816862                . struct_info 
@@ -831,6 +877,7 @@ impl<'a, 'de> Visitor<'de> for StructVariantVisitor<'a> {
831877
832878struct  TupleVariantVisitor < ' a >  { 
833879    tuple_info :  & ' static  TupleVariantInfo , 
880+     registration :  & ' a  TypeRegistration , 
834881    registry :  & ' a  TypeRegistry , 
835882} 
836883
@@ -845,6 +892,18 @@ impl<'a, 'de> Visitor<'de> for TupleVariantVisitor<'a> {
845892    where 
846893        V :  SeqAccess < ' de > , 
847894    { 
895+         let  ignored_len = self 
896+             . registration 
897+             . data :: < SerializationData > ( ) 
898+             . map ( |data| data. len ( ) ) 
899+             . unwrap_or ( 0 ) ; 
900+         let  field_len = self . tuple_info . field_len ( ) . saturating_sub ( ignored_len) ; 
901+ 
902+         if  field_len == 0  { 
903+             // Handle all fields being ignored 
904+             return  Ok ( DynamicTuple :: default ( ) ) ; 
905+         } 
906+ 
848907        visit_tuple ( & mut  seq,  self . tuple_info ,  self . registry ) 
849908    } 
850909} 
@@ -1011,10 +1070,15 @@ mod tests {
10111070        map_value :  HashMap < u8 ,  usize > , 
10121071        struct_value :  SomeStruct , 
10131072        tuple_struct_value :  SomeTupleStruct , 
1073+         unit_struct :  SomeUnitStruct , 
10141074        unit_enum :  SomeEnum , 
10151075        newtype_enum :  SomeEnum , 
10161076        tuple_enum :  SomeEnum , 
10171077        struct_enum :  SomeEnum , 
1078+         ignored_struct :  SomeIgnoredStruct , 
1079+         ignored_tuple_struct :  SomeIgnoredTupleStruct , 
1080+         ignored_struct_variant :  SomeIgnoredEnum , 
1081+         ignored_tuple_variant :  SomeIgnoredEnum , 
10181082        custom_deserialize :  CustomDeserialize , 
10191083    } 
10201084
@@ -1026,6 +1090,18 @@ mod tests {
10261090    #[ derive( Reflect ,  FromReflect ,  Debug ,  PartialEq ) ]  
10271091    struct  SomeTupleStruct ( String ) ; 
10281092
1093+     #[ derive( Reflect ,  FromReflect ,  Debug ,  PartialEq ) ]  
1094+     struct  SomeUnitStruct ; 
1095+ 
1096+     #[ derive( Reflect ,  FromReflect ,  Debug ,  PartialEq ) ]  
1097+     struct  SomeIgnoredStruct  { 
1098+         #[ reflect( ignore) ]  
1099+         ignored :  i32 , 
1100+     } 
1101+ 
1102+     #[ derive( Reflect ,  FromReflect ,  Debug ,  PartialEq ) ]  
1103+     struct  SomeIgnoredTupleStruct ( #[ reflect( ignore) ]   i32 ) ; 
1104+ 
10291105    #[ derive( Reflect ,  FromReflect ,  Debug ,  PartialEq ,  Deserialize ) ]  
10301106    struct  SomeDeserializableStruct  { 
10311107        foo :  i64 , 
@@ -1050,14 +1126,27 @@ mod tests {
10501126        Struct  {  foo :  String  } , 
10511127    } 
10521128
1129+     #[ derive( Reflect ,  FromReflect ,  Debug ,  PartialEq ) ]  
1130+     enum  SomeIgnoredEnum  { 
1131+         Tuple ( #[ reflect( ignore) ]   f32 ,  #[ reflect( ignore) ]   f32 ) , 
1132+         Struct  { 
1133+             #[ reflect( ignore) ]  
1134+             foo :  String , 
1135+         } , 
1136+     } 
1137+ 
10531138    fn  get_registry ( )  -> TypeRegistry  { 
10541139        let  mut  registry = TypeRegistry :: default ( ) ; 
10551140        registry. register :: < MyStruct > ( ) ; 
10561141        registry. register :: < SomeStruct > ( ) ; 
10571142        registry. register :: < SomeTupleStruct > ( ) ; 
1143+         registry. register :: < SomeUnitStruct > ( ) ; 
1144+         registry. register :: < SomeIgnoredStruct > ( ) ; 
1145+         registry. register :: < SomeIgnoredTupleStruct > ( ) ; 
10581146        registry. register :: < CustomDeserialize > ( ) ; 
10591147        registry. register :: < SomeDeserializableStruct > ( ) ; 
10601148        registry. register :: < SomeEnum > ( ) ; 
1149+         registry. register :: < SomeIgnoredEnum > ( ) ; 
10611150        registry. register :: < i8 > ( ) ; 
10621151        registry. register :: < String > ( ) ; 
10631152        registry. register :: < i64 > ( ) ; 
@@ -1090,12 +1179,19 @@ mod tests {
10901179            map_value :  map, 
10911180            struct_value :  SomeStruct  {  foo :  999999999  } , 
10921181            tuple_struct_value :  SomeTupleStruct ( String :: from ( "Tuple Struct" ) ) , 
1182+             unit_struct :  SomeUnitStruct , 
10931183            unit_enum :  SomeEnum :: Unit , 
10941184            newtype_enum :  SomeEnum :: NewType ( 123 ) , 
10951185            tuple_enum :  SomeEnum :: Tuple ( 1.23 ,  3.21 ) , 
10961186            struct_enum :  SomeEnum :: Struct  { 
10971187                foo :  String :: from ( "Struct variant value" ) , 
10981188            } , 
1189+             ignored_struct :  SomeIgnoredStruct  {  ignored :  0  } , 
1190+             ignored_tuple_struct :  SomeIgnoredTupleStruct ( 0 ) , 
1191+             ignored_struct_variant :  SomeIgnoredEnum :: Struct  { 
1192+                 foo :  String :: default ( ) , 
1193+             } , 
1194+             ignored_tuple_variant :  SomeIgnoredEnum :: Tuple ( 0.0 ,  0.0 ) , 
10991195            custom_deserialize :  CustomDeserialize  { 
11001196                value :  100 , 
11011197                inner_struct :  SomeDeserializableStruct  {  foo :  101  } , 
@@ -1125,12 +1221,17 @@ mod tests {
11251221                    foo: 999999999, 
11261222                ), 
11271223                tuple_struct_value: ("Tuple Struct"), 
1224+                 unit_struct: (), 
11281225                unit_enum: Unit, 
11291226                newtype_enum: NewType(123), 
11301227                tuple_enum: Tuple(1.23, 3.21), 
11311228                struct_enum: Struct( 
11321229                    foo: "Struct variant value", 
11331230                ), 
1231+                 ignored_struct: (), 
1232+                 ignored_tuple_struct: (), 
1233+                 ignored_struct_variant: Struct(), 
1234+                 ignored_tuple_variant: Tuple(), 
11341235                custom_deserialize: ( 
11351236                    value: 100, 
11361237                    renamed: ( 
@@ -1337,12 +1438,19 @@ mod tests {
13371438            map_value :  map, 
13381439            struct_value :  SomeStruct  {  foo :  999999999  } , 
13391440            tuple_struct_value :  SomeTupleStruct ( String :: from ( "Tuple Struct" ) ) , 
1441+             unit_struct :  SomeUnitStruct , 
13401442            unit_enum :  SomeEnum :: Unit , 
13411443            newtype_enum :  SomeEnum :: NewType ( 123 ) , 
13421444            tuple_enum :  SomeEnum :: Tuple ( 1.23 ,  3.21 ) , 
13431445            struct_enum :  SomeEnum :: Struct  { 
13441446                foo :  String :: from ( "Struct variant value" ) , 
13451447            } , 
1448+             ignored_struct :  SomeIgnoredStruct  {  ignored :  0  } , 
1449+             ignored_tuple_struct :  SomeIgnoredTupleStruct ( 0 ) , 
1450+             ignored_struct_variant :  SomeIgnoredEnum :: Struct  { 
1451+                 foo :  String :: default ( ) , 
1452+             } , 
1453+             ignored_tuple_variant :  SomeIgnoredEnum :: Tuple ( 0.0 ,  0.0 ) , 
13461454            custom_deserialize :  CustomDeserialize  { 
13471455                value :  100 , 
13481456                inner_struct :  SomeDeserializableStruct  {  foo :  101  } , 
@@ -1363,7 +1471,8 @@ mod tests {
13631471            108 ,  101 ,  32 ,  83 ,  116 ,  114 ,  117 ,  99 ,  116 ,  0 ,  0 ,  0 ,  0 ,  1 ,  0 ,  0 ,  0 ,  123 ,  0 ,  0 ,  0 ,  0 ,  0 , 
13641472            0 ,  0 ,  2 ,  0 ,  0 ,  0 ,  164 ,  112 ,  157 ,  63 ,  164 ,  112 ,  77 ,  64 ,  3 ,  0 ,  0 ,  0 ,  20 ,  0 ,  0 ,  0 ,  0 ,  0 , 
13651473            0 ,  0 ,  83 ,  116 ,  114 ,  117 ,  99 ,  116 ,  32 ,  118 ,  97 ,  114 ,  105 ,  97 ,  110 ,  116 ,  32 ,  118 ,  97 , 
1366-             108 ,  117 ,  101 ,  100 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  101 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
1474+             108 ,  117 ,  101 ,  1 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  100 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  101 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 , 
1475+             0 , 
13671476        ] ; 
13681477
13691478        let  deserializer = UntypedReflectDeserializer :: new ( & registry) ; 
@@ -1392,12 +1501,19 @@ mod tests {
13921501            map_value :  map, 
13931502            struct_value :  SomeStruct  {  foo :  999999999  } , 
13941503            tuple_struct_value :  SomeTupleStruct ( String :: from ( "Tuple Struct" ) ) , 
1504+             unit_struct :  SomeUnitStruct , 
13951505            unit_enum :  SomeEnum :: Unit , 
13961506            newtype_enum :  SomeEnum :: NewType ( 123 ) , 
13971507            tuple_enum :  SomeEnum :: Tuple ( 1.23 ,  3.21 ) , 
13981508            struct_enum :  SomeEnum :: Struct  { 
13991509                foo :  String :: from ( "Struct variant value" ) , 
14001510            } , 
1511+             ignored_struct :  SomeIgnoredStruct  {  ignored :  0  } , 
1512+             ignored_tuple_struct :  SomeIgnoredTupleStruct ( 0 ) , 
1513+             ignored_struct_variant :  SomeIgnoredEnum :: Struct  { 
1514+                 foo :  String :: default ( ) , 
1515+             } , 
1516+             ignored_tuple_variant :  SomeIgnoredEnum :: Tuple ( 0.0 ,  0.0 ) , 
14011517            custom_deserialize :  CustomDeserialize  { 
14021518                value :  100 , 
14031519                inner_struct :  SomeDeserializableStruct  {  foo :  101  } , 
@@ -1409,14 +1525,15 @@ mod tests {
14091525        let  input = vec ! [ 
14101526            129 ,  217 ,  40 ,  98 ,  101 ,  118 ,  121 ,  95 ,  114 ,  101 ,  102 ,  108 ,  101 ,  99 ,  116 ,  58 ,  58 ,  115 , 
14111527            101 ,  114 ,  100 ,  101 ,  58 ,  58 ,  100 ,  101 ,  58 ,  58 ,  116 ,  101 ,  115 ,  116 ,  115 ,  58 ,  58 ,  77 ,  121 , 
1412-             83 ,  116 ,  114 ,  117 ,  99 ,  116 ,  158 ,  123 ,  172 ,  72 ,  101 ,  108 ,  108 ,  111 ,  32 ,  119 ,  111 ,  114 , 
1413-             108 ,  100 ,  33 ,  145 ,  123 ,  146 ,  202 ,  64 ,  73 ,  15 ,  219 ,  205 ,  5 ,  57 ,  149 ,  254 ,  255 ,  0 ,  1 ,  2 , 
1414-             149 ,  254 ,  255 ,  0 ,  1 ,  2 ,  129 ,  64 ,  32 ,  145 ,  206 ,  59 ,  154 ,  201 ,  255 ,  145 ,  172 ,  84 ,  117 , 
1415-             112 ,  108 ,  101 ,  32 ,  83 ,  116 ,  114 ,  117 ,  99 ,  116 ,  164 ,  85 ,  110 ,  105 ,  116 ,  129 ,  167 ,  78 , 
1416-             101 ,  119 ,  84 ,  121 ,  112 ,  101 ,  123 ,  129 ,  165 ,  84 ,  117 ,  112 ,  108 ,  101 ,  146 ,  202 ,  63 ,  157 , 
1417-             112 ,  164 ,  202 ,  64 ,  77 ,  112 ,  164 ,  129 ,  166 ,  83 ,  116 ,  114 ,  117 ,  99 ,  116 ,  145 ,  180 ,  83 , 
1418-             116 ,  114 ,  117 ,  99 ,  116 ,  32 ,  118 ,  97 ,  114 ,  105 ,  97 ,  110 ,  116 ,  32 ,  118 ,  97 ,  108 ,  117 , 
1419-             101 ,  146 ,  100 ,  145 ,  101 , 
1528+             83 ,  116 ,  114 ,  117 ,  99 ,  116 ,  220 ,  0 ,  19 ,  123 ,  172 ,  72 ,  101 ,  108 ,  108 ,  111 ,  32 ,  119 ,  111 , 
1529+             114 ,  108 ,  100 ,  33 ,  145 ,  123 ,  146 ,  202 ,  64 ,  73 ,  15 ,  219 ,  205 ,  5 ,  57 ,  149 ,  254 ,  255 ,  0 , 
1530+             1 ,  2 ,  149 ,  254 ,  255 ,  0 ,  1 ,  2 ,  129 ,  64 ,  32 ,  145 ,  206 ,  59 ,  154 ,  201 ,  255 ,  145 ,  172 ,  84 , 
1531+             117 ,  112 ,  108 ,  101 ,  32 ,  83 ,  116 ,  114 ,  117 ,  99 ,  116 ,  144 ,  164 ,  85 ,  110 ,  105 ,  116 ,  129 , 
1532+             167 ,  78 ,  101 ,  119 ,  84 ,  121 ,  112 ,  101 ,  123 ,  129 ,  165 ,  84 ,  117 ,  112 ,  108 ,  101 ,  146 ,  202 , 
1533+             63 ,  157 ,  112 ,  164 ,  202 ,  64 ,  77 ,  112 ,  164 ,  129 ,  166 ,  83 ,  116 ,  114 ,  117 ,  99 ,  116 ,  145 , 
1534+             180 ,  83 ,  116 ,  114 ,  117 ,  99 ,  116 ,  32 ,  118 ,  97 ,  114 ,  105 ,  97 ,  110 ,  116 ,  32 ,  118 ,  97 ,  108 , 
1535+             117 ,  101 ,  144 ,  144 ,  129 ,  166 ,  83 ,  116 ,  114 ,  117 ,  99 ,  116 ,  144 ,  129 ,  165 ,  84 ,  117 ,  112 , 
1536+             108 ,  101 ,  144 ,  146 ,  100 ,  145 ,  101 , 
14201537        ] ; 
14211538
14221539        let  deserializer = UntypedReflectDeserializer :: new ( & registry) ; 
0 commit comments