@@ -341,6 +341,7 @@ impl<'a, 'de> DeserializeSeed<'de> for TypedReflectDeserializer<'a> {
341
341
struct_info. field_names ( ) ,
342
342
StructVisitor {
343
343
struct_info,
344
+ registration : self . registration ,
344
345
registry : self . registry ,
345
346
} ,
346
347
) ?;
@@ -411,6 +412,7 @@ impl<'a, 'de> DeserializeSeed<'de> for TypedReflectDeserializer<'a> {
411
412
enum_info. variant_names ( ) ,
412
413
EnumVisitor {
413
414
enum_info,
415
+ registration : self . registration ,
414
416
registry : self . registry ,
415
417
} ,
416
418
) ?
@@ -439,6 +441,7 @@ impl<'a, 'de> DeserializeSeed<'de> for TypedReflectDeserializer<'a> {
439
441
440
442
struct StructVisitor < ' a > {
441
443
struct_info : & ' static StructInfo ,
444
+ registration : & ' a TypeRegistration ,
442
445
registry : & ' a TypeRegistry ,
443
446
}
444
447
@@ -463,6 +466,18 @@ impl<'a, 'de> Visitor<'de> for StructVisitor<'a> {
463
466
let mut index = 0usize ;
464
467
let mut output = DynamicStruct :: default ( ) ;
465
468
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
+
466
481
while let Some ( value) = seq. next_element_seed ( TypedReflectDeserializer {
467
482
registration : self
468
483
. struct_info
@@ -501,6 +516,21 @@ impl<'a, 'de> Visitor<'de> for TupleStructVisitor<'a> {
501
516
let mut index = 0usize ;
502
517
let mut tuple_struct = DynamicTupleStruct :: default ( ) ;
503
518
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
+
504
534
let get_field_registration = |index : usize | -> Result < & ' a TypeRegistration , V :: Error > {
505
535
let field = self . tuple_struct_info . field_at ( index) . ok_or_else ( || {
506
536
de:: Error :: custom ( format_args ! (
@@ -675,6 +705,7 @@ impl<'a, 'de> Visitor<'de> for MapVisitor<'a> {
675
705
676
706
struct EnumVisitor < ' a > {
677
707
enum_info : & ' static EnumInfo ,
708
+ registration : & ' a TypeRegistration ,
678
709
registry : & ' a TypeRegistry ,
679
710
}
680
711
@@ -701,6 +732,7 @@ impl<'a, 'de> Visitor<'de> for EnumVisitor<'a> {
701
732
struct_info. field_names ( ) ,
702
733
StructVariantVisitor {
703
734
struct_info,
735
+ registration : self . registration ,
704
736
registry : self . registry ,
705
737
} ,
706
738
) ?
@@ -722,6 +754,7 @@ impl<'a, 'de> Visitor<'de> for EnumVisitor<'a> {
722
754
tuple_info. field_len ( ) ,
723
755
TupleVariantVisitor {
724
756
tuple_info,
757
+ registration : self . registration ,
725
758
registry : self . registry ,
726
759
} ,
727
760
) ?
@@ -787,6 +820,7 @@ impl<'de> DeserializeSeed<'de> for VariantDeserializer {
787
820
788
821
struct StructVariantVisitor < ' a > {
789
822
struct_info : & ' static StructVariantInfo ,
823
+ registration : & ' a TypeRegistration ,
790
824
registry : & ' a TypeRegistry ,
791
825
}
792
826
@@ -811,6 +845,18 @@ impl<'a, 'de> Visitor<'de> for StructVariantVisitor<'a> {
811
845
let mut index = 0usize ;
812
846
let mut output = DynamicStruct :: default ( ) ;
813
847
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
+
814
860
while let Some ( value) = seq. next_element_seed ( TypedReflectDeserializer {
815
861
registration : self
816
862
. struct_info
@@ -831,6 +877,7 @@ impl<'a, 'de> Visitor<'de> for StructVariantVisitor<'a> {
831
877
832
878
struct TupleVariantVisitor < ' a > {
833
879
tuple_info : & ' static TupleVariantInfo ,
880
+ registration : & ' a TypeRegistration ,
834
881
registry : & ' a TypeRegistry ,
835
882
}
836
883
@@ -845,6 +892,18 @@ impl<'a, 'de> Visitor<'de> for TupleVariantVisitor<'a> {
845
892
where
846
893
V : SeqAccess < ' de > ,
847
894
{
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
+
848
907
visit_tuple ( & mut seq, self . tuple_info , self . registry )
849
908
}
850
909
}
@@ -1011,10 +1070,15 @@ mod tests {
1011
1070
map_value : HashMap < u8 , usize > ,
1012
1071
struct_value : SomeStruct ,
1013
1072
tuple_struct_value : SomeTupleStruct ,
1073
+ unit_struct : SomeUnitStruct ,
1014
1074
unit_enum : SomeEnum ,
1015
1075
newtype_enum : SomeEnum ,
1016
1076
tuple_enum : SomeEnum ,
1017
1077
struct_enum : SomeEnum ,
1078
+ ignored_struct : SomeIgnoredStruct ,
1079
+ ignored_tuple_struct : SomeIgnoredTupleStruct ,
1080
+ ignored_struct_variant : SomeIgnoredEnum ,
1081
+ ignored_tuple_variant : SomeIgnoredEnum ,
1018
1082
custom_deserialize : CustomDeserialize ,
1019
1083
}
1020
1084
@@ -1026,6 +1090,18 @@ mod tests {
1026
1090
#[ derive( Reflect , FromReflect , Debug , PartialEq ) ]
1027
1091
struct SomeTupleStruct ( String ) ;
1028
1092
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
+
1029
1105
#[ derive( Reflect , FromReflect , Debug , PartialEq , Deserialize ) ]
1030
1106
struct SomeDeserializableStruct {
1031
1107
foo : i64 ,
@@ -1050,14 +1126,27 @@ mod tests {
1050
1126
Struct { foo : String } ,
1051
1127
}
1052
1128
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
+
1053
1138
fn get_registry ( ) -> TypeRegistry {
1054
1139
let mut registry = TypeRegistry :: default ( ) ;
1055
1140
registry. register :: < MyStruct > ( ) ;
1056
1141
registry. register :: < SomeStruct > ( ) ;
1057
1142
registry. register :: < SomeTupleStruct > ( ) ;
1143
+ registry. register :: < SomeUnitStruct > ( ) ;
1144
+ registry. register :: < SomeIgnoredStruct > ( ) ;
1145
+ registry. register :: < SomeIgnoredTupleStruct > ( ) ;
1058
1146
registry. register :: < CustomDeserialize > ( ) ;
1059
1147
registry. register :: < SomeDeserializableStruct > ( ) ;
1060
1148
registry. register :: < SomeEnum > ( ) ;
1149
+ registry. register :: < SomeIgnoredEnum > ( ) ;
1061
1150
registry. register :: < i8 > ( ) ;
1062
1151
registry. register :: < String > ( ) ;
1063
1152
registry. register :: < i64 > ( ) ;
@@ -1090,12 +1179,19 @@ mod tests {
1090
1179
map_value : map,
1091
1180
struct_value : SomeStruct { foo : 999999999 } ,
1092
1181
tuple_struct_value : SomeTupleStruct ( String :: from ( "Tuple Struct" ) ) ,
1182
+ unit_struct : SomeUnitStruct ,
1093
1183
unit_enum : SomeEnum :: Unit ,
1094
1184
newtype_enum : SomeEnum :: NewType ( 123 ) ,
1095
1185
tuple_enum : SomeEnum :: Tuple ( 1.23 , 3.21 ) ,
1096
1186
struct_enum : SomeEnum :: Struct {
1097
1187
foo : String :: from ( "Struct variant value" ) ,
1098
1188
} ,
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 ) ,
1099
1195
custom_deserialize : CustomDeserialize {
1100
1196
value : 100 ,
1101
1197
inner_struct : SomeDeserializableStruct { foo : 101 } ,
@@ -1125,12 +1221,17 @@ mod tests {
1125
1221
foo: 999999999,
1126
1222
),
1127
1223
tuple_struct_value: ("Tuple Struct"),
1224
+ unit_struct: (),
1128
1225
unit_enum: Unit,
1129
1226
newtype_enum: NewType(123),
1130
1227
tuple_enum: Tuple(1.23, 3.21),
1131
1228
struct_enum: Struct(
1132
1229
foo: "Struct variant value",
1133
1230
),
1231
+ ignored_struct: (),
1232
+ ignored_tuple_struct: (),
1233
+ ignored_struct_variant: Struct(),
1234
+ ignored_tuple_variant: Tuple(),
1134
1235
custom_deserialize: (
1135
1236
value: 100,
1136
1237
renamed: (
@@ -1337,12 +1438,19 @@ mod tests {
1337
1438
map_value : map,
1338
1439
struct_value : SomeStruct { foo : 999999999 } ,
1339
1440
tuple_struct_value : SomeTupleStruct ( String :: from ( "Tuple Struct" ) ) ,
1441
+ unit_struct : SomeUnitStruct ,
1340
1442
unit_enum : SomeEnum :: Unit ,
1341
1443
newtype_enum : SomeEnum :: NewType ( 123 ) ,
1342
1444
tuple_enum : SomeEnum :: Tuple ( 1.23 , 3.21 ) ,
1343
1445
struct_enum : SomeEnum :: Struct {
1344
1446
foo : String :: from ( "Struct variant value" ) ,
1345
1447
} ,
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 ) ,
1346
1454
custom_deserialize : CustomDeserialize {
1347
1455
value : 100 ,
1348
1456
inner_struct : SomeDeserializableStruct { foo : 101 } ,
@@ -1363,7 +1471,8 @@ mod tests {
1363
1471
108 , 101 , 32 , 83 , 116 , 114 , 117 , 99 , 116 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 123 , 0 , 0 , 0 , 0 , 0 ,
1364
1472
0 , 0 , 2 , 0 , 0 , 0 , 164 , 112 , 157 , 63 , 164 , 112 , 77 , 64 , 3 , 0 , 0 , 0 , 20 , 0 , 0 , 0 , 0 , 0 ,
1365
1473
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 ,
1367
1476
] ;
1368
1477
1369
1478
let deserializer = UntypedReflectDeserializer :: new ( & registry) ;
@@ -1392,12 +1501,19 @@ mod tests {
1392
1501
map_value : map,
1393
1502
struct_value : SomeStruct { foo : 999999999 } ,
1394
1503
tuple_struct_value : SomeTupleStruct ( String :: from ( "Tuple Struct" ) ) ,
1504
+ unit_struct : SomeUnitStruct ,
1395
1505
unit_enum : SomeEnum :: Unit ,
1396
1506
newtype_enum : SomeEnum :: NewType ( 123 ) ,
1397
1507
tuple_enum : SomeEnum :: Tuple ( 1.23 , 3.21 ) ,
1398
1508
struct_enum : SomeEnum :: Struct {
1399
1509
foo : String :: from ( "Struct variant value" ) ,
1400
1510
} ,
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 ) ,
1401
1517
custom_deserialize : CustomDeserialize {
1402
1518
value : 100 ,
1403
1519
inner_struct : SomeDeserializableStruct { foo : 101 } ,
@@ -1409,14 +1525,15 @@ mod tests {
1409
1525
let input = vec ! [
1410
1526
129 , 217 , 40 , 98 , 101 , 118 , 121 , 95 , 114 , 101 , 102 , 108 , 101 , 99 , 116 , 58 , 58 , 115 ,
1411
1527
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 ,
1420
1537
] ;
1421
1538
1422
1539
let deserializer = UntypedReflectDeserializer :: new ( & registry) ;
0 commit comments