@@ -412,6 +412,7 @@ impl<'a, 'de> DeserializeSeed<'de> for TypedReflectDeserializer<'a> {
412412 enum_info. variant_names ( ) ,
413413 EnumVisitor {
414414 enum_info,
415+ registration : self . registration ,
415416 registry : self . registry ,
416417 } ,
417418 ) ?
@@ -704,6 +705,7 @@ impl<'a, 'de> Visitor<'de> for MapVisitor<'a> {
704705
705706struct EnumVisitor < ' a > {
706707 enum_info : & ' static EnumInfo ,
708+ registration : & ' a TypeRegistration ,
707709 registry : & ' a TypeRegistry ,
708710}
709711
@@ -730,6 +732,7 @@ impl<'a, 'de> Visitor<'de> for EnumVisitor<'a> {
730732 struct_info. field_names ( ) ,
731733 StructVariantVisitor {
732734 struct_info,
735+ registration : self . registration ,
733736 registry : self . registry ,
734737 } ,
735738 ) ?
@@ -751,6 +754,7 @@ impl<'a, 'de> Visitor<'de> for EnumVisitor<'a> {
751754 tuple_info. field_len ( ) ,
752755 TupleVariantVisitor {
753756 tuple_info,
757+ registration : self . registration ,
754758 registry : self . registry ,
755759 } ,
756760 ) ?
@@ -816,6 +820,7 @@ impl<'de> DeserializeSeed<'de> for VariantDeserializer {
816820
817821struct StructVariantVisitor < ' a > {
818822 struct_info : & ' static StructVariantInfo ,
823+ registration : & ' a TypeRegistration ,
819824 registry : & ' a TypeRegistry ,
820825}
821826
@@ -840,6 +845,18 @@ impl<'a, 'de> Visitor<'de> for StructVariantVisitor<'a> {
840845 let mut index = 0usize ;
841846 let mut output = DynamicStruct :: default ( ) ;
842847
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+
843860 while let Some ( value) = seq. next_element_seed ( TypedReflectDeserializer {
844861 registration : self
845862 . struct_info
@@ -860,6 +877,7 @@ impl<'a, 'de> Visitor<'de> for StructVariantVisitor<'a> {
860877
861878struct TupleVariantVisitor < ' a > {
862879 tuple_info : & ' static TupleVariantInfo ,
880+ registration : & ' a TypeRegistration ,
863881 registry : & ' a TypeRegistry ,
864882}
865883
@@ -874,6 +892,18 @@ impl<'a, 'de> Visitor<'de> for TupleVariantVisitor<'a> {
874892 where
875893 V : SeqAccess < ' de > ,
876894 {
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+
877907 visit_tuple ( & mut seq, self . tuple_info , self . registry )
878908 }
879909}
@@ -1042,6 +1072,7 @@ mod tests {
10421072 tuple_struct_value : SomeTupleStruct ,
10431073 unit_struct : SomeUnitStruct ,
10441074 ignored_struct : SomeIgnoredStruct ,
1075+ ignored_enum : SomeIgnoredEnum ,
10451076 unit_enum : SomeEnum ,
10461077 newtype_enum : SomeEnum ,
10471078 tuple_enum : SomeEnum ,
@@ -1087,6 +1118,11 @@ mod tests {
10871118 Struct { foo : String } ,
10881119 }
10891120
1121+ #[ derive( Reflect , FromReflect , Debug , PartialEq ) ]
1122+ enum SomeIgnoredEnum {
1123+ Ignored ( #[ reflect( ignore) ] f32 , #[ reflect( ignore) ] f32 ) ,
1124+ }
1125+
10901126 fn get_registry ( ) -> TypeRegistry {
10911127 let mut registry = TypeRegistry :: default ( ) ;
10921128 registry. register :: < MyStruct > ( ) ;
@@ -1097,6 +1133,7 @@ mod tests {
10971133 registry. register :: < CustomDeserialize > ( ) ;
10981134 registry. register :: < SomeDeserializableStruct > ( ) ;
10991135 registry. register :: < SomeEnum > ( ) ;
1136+ registry. register :: < SomeIgnoredEnum > ( ) ;
11001137 registry. register :: < i8 > ( ) ;
11011138 registry. register :: < String > ( ) ;
11021139 registry. register :: < i64 > ( ) ;
@@ -1131,6 +1168,7 @@ mod tests {
11311168 tuple_struct_value : SomeTupleStruct ( String :: from ( "Tuple Struct" ) ) ,
11321169 unit_struct : SomeUnitStruct ,
11331170 ignored_struct : SomeIgnoredStruct ( 0 ) ,
1171+ ignored_enum : SomeIgnoredEnum :: Ignored ( 0.0 , 0.0 ) ,
11341172 unit_enum : SomeEnum :: Unit ,
11351173 newtype_enum : SomeEnum :: NewType ( 123 ) ,
11361174 tuple_enum : SomeEnum :: Tuple ( 1.23 , 3.21 ) ,
@@ -1168,6 +1206,7 @@ mod tests {
11681206 tuple_struct_value: ("Tuple Struct"),
11691207 unit_struct: (),
11701208 ignored_struct: (),
1209+ ignored_enum: Ignored(),
11711210 unit_enum: Unit,
11721211 newtype_enum: NewType(123),
11731212 tuple_enum: Tuple(1.23, 3.21),
@@ -1382,6 +1421,7 @@ mod tests {
13821421 tuple_struct_value : SomeTupleStruct ( String :: from ( "Tuple Struct" ) ) ,
13831422 unit_struct : SomeUnitStruct ,
13841423 ignored_struct : SomeIgnoredStruct ( 0 ) ,
1424+ ignored_enum : SomeIgnoredEnum :: Ignored ( 0.0 , 0.0 ) ,
13851425 unit_enum : SomeEnum :: Unit ,
13861426 newtype_enum : SomeEnum :: NewType ( 123 ) ,
13871427 tuple_enum : SomeEnum :: Tuple ( 1.23 , 3.21 ) ,
@@ -1405,10 +1445,10 @@ mod tests {
14051445 255 , 255 , 255 , 255 , 255 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 2 , 0 , 0 , 0 , 254 , 255 , 255 , 255 , 255 ,
14061446 255 , 255 , 255 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 2 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 64 , 32 , 0 ,
14071447 0 , 0 , 0 , 0 , 0 , 0 , 255 , 201 , 154 , 59 , 0 , 0 , 0 , 0 , 12 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 84 , 117 , 112 ,
1408- 108 , 101 , 32 , 83 , 116 , 114 , 117 , 99 , 116 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 123 , 0 , 0 , 0 , 0 , 0 ,
1409- 0 , 0 , 2 , 0 , 0 , 0 , 164 , 112 , 157 , 63 , 164 , 112 , 77 , 64 , 3 , 0 , 0 , 0 , 20 , 0 , 0 , 0 , 0 , 0 ,
1410- 0 , 0 , 83 , 116 , 114 , 117 , 99 , 116 , 32 , 118 , 97 , 114 , 105 , 97 , 110 , 116 , 32 , 118 , 97 ,
1411- 108 , 117 , 101 , 100 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 101 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
1448+ 108 , 101 , 32 , 83 , 116 , 114 , 117 , 99 , 116 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 123 , 0 ,
1449+ 0 , 0 , 0 , 0 , 0 , 0 , 2 , 0 , 0 , 0 , 164 , 112 , 157 , 63 , 164 , 112 , 77 , 64 , 3 , 0 , 0 , 0 , 20 , 0 ,
1450+ 0 , 0 , 0 , 0 , 0 , 0 , 83 , 116 , 114 , 117 , 99 , 116 , 32 , 118 , 97 , 114 , 105 , 97 , 110 , 116 , 32 ,
1451+ 118 , 97 , 108 , 117 , 101 , 100 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 101 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
14121452 ] ;
14131453
14141454 let deserializer = UntypedReflectDeserializer :: new ( & registry) ;
@@ -1439,6 +1479,7 @@ mod tests {
14391479 tuple_struct_value : SomeTupleStruct ( String :: from ( "Tuple Struct" ) ) ,
14401480 unit_struct : SomeUnitStruct ,
14411481 ignored_struct : SomeIgnoredStruct ( 0 ) ,
1482+ ignored_enum : SomeIgnoredEnum :: Ignored ( 0.0 , 0.0 ) ,
14421483 unit_enum : SomeEnum :: Unit ,
14431484 newtype_enum : SomeEnum :: NewType ( 123 ) ,
14441485 tuple_enum : SomeEnum :: Tuple ( 1.23 , 3.21 ) ,
@@ -1456,14 +1497,14 @@ mod tests {
14561497 let input = vec ! [
14571498 129 , 217 , 40 , 98 , 101 , 118 , 121 , 95 , 114 , 101 , 102 , 108 , 101 , 99 , 116 , 58 , 58 , 115 ,
14581499 101 , 114 , 100 , 101 , 58 , 58 , 100 , 101 , 58 , 58 , 116 , 101 , 115 , 116 , 115 , 58 , 58 , 77 , 121 ,
1459- 83 , 116 , 114 , 117 , 99 , 116 , 220 , 0 , 16 , 123 , 172 , 72 , 101 , 108 , 108 , 111 , 32 , 119 , 111 ,
1500+ 83 , 116 , 114 , 117 , 99 , 116 , 220 , 0 , 17 , 123 , 172 , 72 , 101 , 108 , 108 , 111 , 32 , 119 , 111 ,
14601501 114 , 108 , 100 , 33 , 145 , 123 , 146 , 202 , 64 , 73 , 15 , 219 , 205 , 5 , 57 , 149 , 254 , 255 , 0 ,
14611502 1 , 2 , 149 , 254 , 255 , 0 , 1 , 2 , 129 , 64 , 32 , 145 , 206 , 59 , 154 , 201 , 255 , 145 , 172 , 84 ,
1462- 117 , 112 , 108 , 101 , 32 , 83 , 116 , 114 , 117 , 99 , 116 , 144 , 144 , 164 , 85 , 110 , 105 , 116 ,
1463- 129 , 167 , 78 , 101 , 119 , 84 , 121 , 112 , 101 , 123 , 129 , 165 , 84 , 117 , 112 , 108 , 101 , 146 ,
1464- 202 , 63 , 157 , 112 , 164 , 202 , 64 , 77 , 112 , 164 , 129 , 166 , 83 , 116 , 114 , 117 , 99 , 116 ,
1465- 145 , 180 , 83 , 116 , 114 , 117 , 99 , 116 , 32 , 118 , 97 , 114 , 105 , 97 , 110 , 116 , 32 , 118 , 97 ,
1466- 108 , 117 , 101 , 146 , 100 , 145 , 101 ,
1503+ 117 , 112 , 108 , 101 , 32 , 83 , 116 , 114 , 117 , 99 , 116 , 144 , 144 , 129 , 167 , 73 , 103 , 110 ,
1504+ 111 , 114 , 101 , 100 , 144 , 164 , 85 , 110 , 105 , 116 , 129 , 167 , 78 , 101 , 119 , 84 , 121 , 112 ,
1505+ 101 , 123 , 129 , 165 , 84 , 117 , 112 , 108 , 101 , 146 , 202 , 63 , 157 , 112 , 164 , 202 , 64 , 77 ,
1506+ 112 , 164 , 129 , 166 , 83 , 116 , 114 , 117 , 99 , 116 , 145 , 180 , 83 , 116 , 114 , 117 , 99 , 116 ,
1507+ 32 , 118 , 97 , 114 , 105 , 97 , 110 , 116 , 32 , 118 , 97 , 108 , 117 , 101 , 146 , 100 , 145 , 101 ,
14671508 ] ;
14681509
14691510 let deserializer = UntypedReflectDeserializer :: new ( & registry) ;
0 commit comments