bevy_reflect: Fix binary deserialization not working for unit structs (#6722)
# Objective Fixes #6713 Binary deserialization is failing for unit structs as well as structs with all ignored/skipped fields. ## Solution Add a check for the number of possible fields in a struct before deserializing. If empty, don't attempt to deserialize any fields (as there will be none). Note: ~~This does not apply to enums as they do not properly handle skipped fields (see #6721).~~ Enums still do not properly handle skipped fields, but I decided to include the logic for it anyways to account for `#[reflect(ignore)]`'d fields in the meantime. --- ## Changelog - Fix bug where deserializing unit structs would fail for non-self-describing formats
This commit is contained in:
		
							parent
							
								
									a1607b8065
								
							
						
					
					
						commit
						4e2374334f
					
				| @ -341,6 +341,7 @@ impl<'a, 'de> DeserializeSeed<'de> for TypedReflectDeserializer<'a> { | |||||||
|                     struct_info.field_names(), |                     struct_info.field_names(), | ||||||
|                     StructVisitor { |                     StructVisitor { | ||||||
|                         struct_info, |                         struct_info, | ||||||
|  |                         registration: self.registration, | ||||||
|                         registry: self.registry, |                         registry: self.registry, | ||||||
|                     }, |                     }, | ||||||
|                 )?; |                 )?; | ||||||
| @ -411,6 +412,7 @@ impl<'a, 'de> DeserializeSeed<'de> for TypedReflectDeserializer<'a> { | |||||||
|                         enum_info.variant_names(), |                         enum_info.variant_names(), | ||||||
|                         EnumVisitor { |                         EnumVisitor { | ||||||
|                             enum_info, |                             enum_info, | ||||||
|  |                             registration: self.registration, | ||||||
|                             registry: self.registry, |                             registry: self.registry, | ||||||
|                         }, |                         }, | ||||||
|                     )? |                     )? | ||||||
| @ -439,6 +441,7 @@ impl<'a, 'de> DeserializeSeed<'de> for TypedReflectDeserializer<'a> { | |||||||
| 
 | 
 | ||||||
| struct StructVisitor<'a> { | struct StructVisitor<'a> { | ||||||
|     struct_info: &'static StructInfo, |     struct_info: &'static StructInfo, | ||||||
|  |     registration: &'a TypeRegistration, | ||||||
|     registry: &'a TypeRegistry, |     registry: &'a TypeRegistry, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -463,6 +466,18 @@ impl<'a, 'de> Visitor<'de> for StructVisitor<'a> { | |||||||
|         let mut index = 0usize; |         let mut index = 0usize; | ||||||
|         let mut output = DynamicStruct::default(); |         let mut output = DynamicStruct::default(); | ||||||
| 
 | 
 | ||||||
|  |         let ignored_len = self | ||||||
|  |             .registration | ||||||
|  |             .data::<SerializationData>() | ||||||
|  |             .map(|data| data.len()) | ||||||
|  |             .unwrap_or(0); | ||||||
|  |         let field_len = self.struct_info.field_len().saturating_sub(ignored_len); | ||||||
|  | 
 | ||||||
|  |         if field_len == 0 { | ||||||
|  |             // Handle unit structs and ignored fields
 | ||||||
|  |             return Ok(output); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         while let Some(value) = seq.next_element_seed(TypedReflectDeserializer { |         while let Some(value) = seq.next_element_seed(TypedReflectDeserializer { | ||||||
|             registration: self |             registration: self | ||||||
|                 .struct_info |                 .struct_info | ||||||
| @ -501,6 +516,21 @@ impl<'a, 'de> Visitor<'de> for TupleStructVisitor<'a> { | |||||||
|         let mut index = 0usize; |         let mut index = 0usize; | ||||||
|         let mut tuple_struct = DynamicTupleStruct::default(); |         let mut tuple_struct = DynamicTupleStruct::default(); | ||||||
| 
 | 
 | ||||||
|  |         let ignored_len = self | ||||||
|  |             .registration | ||||||
|  |             .data::<SerializationData>() | ||||||
|  |             .map(|data| data.len()) | ||||||
|  |             .unwrap_or(0); | ||||||
|  |         let field_len = self | ||||||
|  |             .tuple_struct_info | ||||||
|  |             .field_len() | ||||||
|  |             .saturating_sub(ignored_len); | ||||||
|  | 
 | ||||||
|  |         if field_len == 0 { | ||||||
|  |             // Handle unit structs and ignored fields
 | ||||||
|  |             return Ok(tuple_struct); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         let get_field_registration = |index: usize| -> Result<&'a TypeRegistration, V::Error> { |         let get_field_registration = |index: usize| -> Result<&'a TypeRegistration, V::Error> { | ||||||
|             let field = self.tuple_struct_info.field_at(index).ok_or_else(|| { |             let field = self.tuple_struct_info.field_at(index).ok_or_else(|| { | ||||||
|                 de::Error::custom(format_args!( |                 de::Error::custom(format_args!( | ||||||
| @ -675,6 +705,7 @@ impl<'a, 'de> Visitor<'de> for MapVisitor<'a> { | |||||||
| 
 | 
 | ||||||
| struct EnumVisitor<'a> { | struct EnumVisitor<'a> { | ||||||
|     enum_info: &'static EnumInfo, |     enum_info: &'static EnumInfo, | ||||||
|  |     registration: &'a TypeRegistration, | ||||||
|     registry: &'a TypeRegistry, |     registry: &'a TypeRegistry, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -701,6 +732,7 @@ impl<'a, 'de> Visitor<'de> for EnumVisitor<'a> { | |||||||
|                     struct_info.field_names(), |                     struct_info.field_names(), | ||||||
|                     StructVariantVisitor { |                     StructVariantVisitor { | ||||||
|                         struct_info, |                         struct_info, | ||||||
|  |                         registration: self.registration, | ||||||
|                         registry: self.registry, |                         registry: self.registry, | ||||||
|                     }, |                     }, | ||||||
|                 )? |                 )? | ||||||
| @ -722,6 +754,7 @@ impl<'a, 'de> Visitor<'de> for EnumVisitor<'a> { | |||||||
|                     tuple_info.field_len(), |                     tuple_info.field_len(), | ||||||
|                     TupleVariantVisitor { |                     TupleVariantVisitor { | ||||||
|                         tuple_info, |                         tuple_info, | ||||||
|  |                         registration: self.registration, | ||||||
|                         registry: self.registry, |                         registry: self.registry, | ||||||
|                     }, |                     }, | ||||||
|                 )? |                 )? | ||||||
| @ -787,6 +820,7 @@ impl<'de> DeserializeSeed<'de> for VariantDeserializer { | |||||||
| 
 | 
 | ||||||
| struct StructVariantVisitor<'a> { | struct StructVariantVisitor<'a> { | ||||||
|     struct_info: &'static StructVariantInfo, |     struct_info: &'static StructVariantInfo, | ||||||
|  |     registration: &'a TypeRegistration, | ||||||
|     registry: &'a TypeRegistry, |     registry: &'a TypeRegistry, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -811,6 +845,18 @@ impl<'a, 'de> Visitor<'de> for StructVariantVisitor<'a> { | |||||||
|         let mut index = 0usize; |         let mut index = 0usize; | ||||||
|         let mut output = DynamicStruct::default(); |         let mut output = DynamicStruct::default(); | ||||||
| 
 | 
 | ||||||
|  |         let ignored_len = self | ||||||
|  |             .registration | ||||||
|  |             .data::<SerializationData>() | ||||||
|  |             .map(|data| data.len()) | ||||||
|  |             .unwrap_or(0); | ||||||
|  |         let field_len = self.struct_info.field_len().saturating_sub(ignored_len); | ||||||
|  | 
 | ||||||
|  |         if field_len == 0 { | ||||||
|  |             // Handle all fields being ignored
 | ||||||
|  |             return Ok(output); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         while let Some(value) = seq.next_element_seed(TypedReflectDeserializer { |         while let Some(value) = seq.next_element_seed(TypedReflectDeserializer { | ||||||
|             registration: self |             registration: self | ||||||
|                 .struct_info |                 .struct_info | ||||||
| @ -831,6 +877,7 @@ impl<'a, 'de> Visitor<'de> for StructVariantVisitor<'a> { | |||||||
| 
 | 
 | ||||||
| struct TupleVariantVisitor<'a> { | struct TupleVariantVisitor<'a> { | ||||||
|     tuple_info: &'static TupleVariantInfo, |     tuple_info: &'static TupleVariantInfo, | ||||||
|  |     registration: &'a TypeRegistration, | ||||||
|     registry: &'a TypeRegistry, |     registry: &'a TypeRegistry, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -845,6 +892,18 @@ impl<'a, 'de> Visitor<'de> for TupleVariantVisitor<'a> { | |||||||
|     where |     where | ||||||
|         V: SeqAccess<'de>, |         V: SeqAccess<'de>, | ||||||
|     { |     { | ||||||
|  |         let ignored_len = self | ||||||
|  |             .registration | ||||||
|  |             .data::<SerializationData>() | ||||||
|  |             .map(|data| data.len()) | ||||||
|  |             .unwrap_or(0); | ||||||
|  |         let field_len = self.tuple_info.field_len().saturating_sub(ignored_len); | ||||||
|  | 
 | ||||||
|  |         if field_len == 0 { | ||||||
|  |             // Handle all fields being ignored
 | ||||||
|  |             return Ok(DynamicTuple::default()); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         visit_tuple(&mut seq, self.tuple_info, self.registry) |         visit_tuple(&mut seq, self.tuple_info, self.registry) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -1011,10 +1070,15 @@ mod tests { | |||||||
|         map_value: HashMap<u8, usize>, |         map_value: HashMap<u8, usize>, | ||||||
|         struct_value: SomeStruct, |         struct_value: SomeStruct, | ||||||
|         tuple_struct_value: SomeTupleStruct, |         tuple_struct_value: SomeTupleStruct, | ||||||
|  |         unit_struct: SomeUnitStruct, | ||||||
|         unit_enum: SomeEnum, |         unit_enum: SomeEnum, | ||||||
|         newtype_enum: SomeEnum, |         newtype_enum: SomeEnum, | ||||||
|         tuple_enum: SomeEnum, |         tuple_enum: SomeEnum, | ||||||
|         struct_enum: SomeEnum, |         struct_enum: SomeEnum, | ||||||
|  |         ignored_struct: SomeIgnoredStruct, | ||||||
|  |         ignored_tuple_struct: SomeIgnoredTupleStruct, | ||||||
|  |         ignored_struct_variant: SomeIgnoredEnum, | ||||||
|  |         ignored_tuple_variant: SomeIgnoredEnum, | ||||||
|         custom_deserialize: CustomDeserialize, |         custom_deserialize: CustomDeserialize, | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -1026,6 +1090,18 @@ mod tests { | |||||||
|     #[derive(Reflect, FromReflect, Debug, PartialEq)] |     #[derive(Reflect, FromReflect, Debug, PartialEq)] | ||||||
|     struct SomeTupleStruct(String); |     struct SomeTupleStruct(String); | ||||||
| 
 | 
 | ||||||
|  |     #[derive(Reflect, FromReflect, Debug, PartialEq)] | ||||||
|  |     struct SomeUnitStruct; | ||||||
|  | 
 | ||||||
|  |     #[derive(Reflect, FromReflect, Debug, PartialEq)] | ||||||
|  |     struct SomeIgnoredStruct { | ||||||
|  |         #[reflect(ignore)] | ||||||
|  |         ignored: i32, | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     #[derive(Reflect, FromReflect, Debug, PartialEq)] | ||||||
|  |     struct SomeIgnoredTupleStruct(#[reflect(ignore)] i32); | ||||||
|  | 
 | ||||||
|     #[derive(Reflect, FromReflect, Debug, PartialEq, Deserialize)] |     #[derive(Reflect, FromReflect, Debug, PartialEq, Deserialize)] | ||||||
|     struct SomeDeserializableStruct { |     struct SomeDeserializableStruct { | ||||||
|         foo: i64, |         foo: i64, | ||||||
| @ -1050,14 +1126,27 @@ mod tests { | |||||||
|         Struct { foo: String }, |         Struct { foo: String }, | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     #[derive(Reflect, FromReflect, Debug, PartialEq)] | ||||||
|  |     enum SomeIgnoredEnum { | ||||||
|  |         Tuple(#[reflect(ignore)] f32, #[reflect(ignore)] f32), | ||||||
|  |         Struct { | ||||||
|  |             #[reflect(ignore)] | ||||||
|  |             foo: String, | ||||||
|  |         }, | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     fn get_registry() -> TypeRegistry { |     fn get_registry() -> TypeRegistry { | ||||||
|         let mut registry = TypeRegistry::default(); |         let mut registry = TypeRegistry::default(); | ||||||
|         registry.register::<MyStruct>(); |         registry.register::<MyStruct>(); | ||||||
|         registry.register::<SomeStruct>(); |         registry.register::<SomeStruct>(); | ||||||
|         registry.register::<SomeTupleStruct>(); |         registry.register::<SomeTupleStruct>(); | ||||||
|  |         registry.register::<SomeUnitStruct>(); | ||||||
|  |         registry.register::<SomeIgnoredStruct>(); | ||||||
|  |         registry.register::<SomeIgnoredTupleStruct>(); | ||||||
|         registry.register::<CustomDeserialize>(); |         registry.register::<CustomDeserialize>(); | ||||||
|         registry.register::<SomeDeserializableStruct>(); |         registry.register::<SomeDeserializableStruct>(); | ||||||
|         registry.register::<SomeEnum>(); |         registry.register::<SomeEnum>(); | ||||||
|  |         registry.register::<SomeIgnoredEnum>(); | ||||||
|         registry.register::<i8>(); |         registry.register::<i8>(); | ||||||
|         registry.register::<String>(); |         registry.register::<String>(); | ||||||
|         registry.register::<i64>(); |         registry.register::<i64>(); | ||||||
| @ -1090,12 +1179,19 @@ mod tests { | |||||||
|             map_value: map, |             map_value: map, | ||||||
|             struct_value: SomeStruct { foo: 999999999 }, |             struct_value: SomeStruct { foo: 999999999 }, | ||||||
|             tuple_struct_value: SomeTupleStruct(String::from("Tuple Struct")), |             tuple_struct_value: SomeTupleStruct(String::from("Tuple Struct")), | ||||||
|  |             unit_struct: SomeUnitStruct, | ||||||
|             unit_enum: SomeEnum::Unit, |             unit_enum: SomeEnum::Unit, | ||||||
|             newtype_enum: SomeEnum::NewType(123), |             newtype_enum: SomeEnum::NewType(123), | ||||||
|             tuple_enum: SomeEnum::Tuple(1.23, 3.21), |             tuple_enum: SomeEnum::Tuple(1.23, 3.21), | ||||||
|             struct_enum: SomeEnum::Struct { |             struct_enum: SomeEnum::Struct { | ||||||
|                 foo: String::from("Struct variant value"), |                 foo: String::from("Struct variant value"), | ||||||
|             }, |             }, | ||||||
|  |             ignored_struct: SomeIgnoredStruct { ignored: 0 }, | ||||||
|  |             ignored_tuple_struct: SomeIgnoredTupleStruct(0), | ||||||
|  |             ignored_struct_variant: SomeIgnoredEnum::Struct { | ||||||
|  |                 foo: String::default(), | ||||||
|  |             }, | ||||||
|  |             ignored_tuple_variant: SomeIgnoredEnum::Tuple(0.0, 0.0), | ||||||
|             custom_deserialize: CustomDeserialize { |             custom_deserialize: CustomDeserialize { | ||||||
|                 value: 100, |                 value: 100, | ||||||
|                 inner_struct: SomeDeserializableStruct { foo: 101 }, |                 inner_struct: SomeDeserializableStruct { foo: 101 }, | ||||||
| @ -1125,12 +1221,17 @@ mod tests { | |||||||
|                     foo: 999999999, |                     foo: 999999999, | ||||||
|                 ), |                 ), | ||||||
|                 tuple_struct_value: ("Tuple Struct"), |                 tuple_struct_value: ("Tuple Struct"), | ||||||
|  |                 unit_struct: (), | ||||||
|                 unit_enum: Unit, |                 unit_enum: Unit, | ||||||
|                 newtype_enum: NewType(123), |                 newtype_enum: NewType(123), | ||||||
|                 tuple_enum: Tuple(1.23, 3.21), |                 tuple_enum: Tuple(1.23, 3.21), | ||||||
|                 struct_enum: Struct( |                 struct_enum: Struct( | ||||||
|                     foo: "Struct variant value", |                     foo: "Struct variant value", | ||||||
|                 ), |                 ), | ||||||
|  |                 ignored_struct: (), | ||||||
|  |                 ignored_tuple_struct: (), | ||||||
|  |                 ignored_struct_variant: Struct(), | ||||||
|  |                 ignored_tuple_variant: Tuple(), | ||||||
|                 custom_deserialize: ( |                 custom_deserialize: ( | ||||||
|                     value: 100, |                     value: 100, | ||||||
|                     renamed: ( |                     renamed: ( | ||||||
| @ -1337,12 +1438,19 @@ mod tests { | |||||||
|             map_value: map, |             map_value: map, | ||||||
|             struct_value: SomeStruct { foo: 999999999 }, |             struct_value: SomeStruct { foo: 999999999 }, | ||||||
|             tuple_struct_value: SomeTupleStruct(String::from("Tuple Struct")), |             tuple_struct_value: SomeTupleStruct(String::from("Tuple Struct")), | ||||||
|  |             unit_struct: SomeUnitStruct, | ||||||
|             unit_enum: SomeEnum::Unit, |             unit_enum: SomeEnum::Unit, | ||||||
|             newtype_enum: SomeEnum::NewType(123), |             newtype_enum: SomeEnum::NewType(123), | ||||||
|             tuple_enum: SomeEnum::Tuple(1.23, 3.21), |             tuple_enum: SomeEnum::Tuple(1.23, 3.21), | ||||||
|             struct_enum: SomeEnum::Struct { |             struct_enum: SomeEnum::Struct { | ||||||
|                 foo: String::from("Struct variant value"), |                 foo: String::from("Struct variant value"), | ||||||
|             }, |             }, | ||||||
|  |             ignored_struct: SomeIgnoredStruct { ignored: 0 }, | ||||||
|  |             ignored_tuple_struct: SomeIgnoredTupleStruct(0), | ||||||
|  |             ignored_struct_variant: SomeIgnoredEnum::Struct { | ||||||
|  |                 foo: String::default(), | ||||||
|  |             }, | ||||||
|  |             ignored_tuple_variant: SomeIgnoredEnum::Tuple(0.0, 0.0), | ||||||
|             custom_deserialize: CustomDeserialize { |             custom_deserialize: CustomDeserialize { | ||||||
|                 value: 100, |                 value: 100, | ||||||
|                 inner_struct: SomeDeserializableStruct { foo: 101 }, |                 inner_struct: SomeDeserializableStruct { foo: 101 }, | ||||||
| @ -1363,7 +1471,8 @@ mod tests { | |||||||
|             108, 101, 32, 83, 116, 114, 117, 99, 116, 0, 0, 0, 0, 1, 0, 0, 0, 123, 0, 0, 0, 0, 0, |             108, 101, 32, 83, 116, 114, 117, 99, 116, 0, 0, 0, 0, 1, 0, 0, 0, 123, 0, 0, 0, 0, 0, | ||||||
|             0, 0, 2, 0, 0, 0, 164, 112, 157, 63, 164, 112, 77, 64, 3, 0, 0, 0, 20, 0, 0, 0, 0, 0, |             0, 0, 2, 0, 0, 0, 164, 112, 157, 63, 164, 112, 77, 64, 3, 0, 0, 0, 20, 0, 0, 0, 0, 0, | ||||||
|             0, 0, 83, 116, 114, 117, 99, 116, 32, 118, 97, 114, 105, 97, 110, 116, 32, 118, 97, |             0, 0, 83, 116, 114, 117, 99, 116, 32, 118, 97, 114, 105, 97, 110, 116, 32, 118, 97, | ||||||
|             108, 117, 101, 100, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, |             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, | ||||||
|  |             0, | ||||||
|         ]; |         ]; | ||||||
| 
 | 
 | ||||||
|         let deserializer = UntypedReflectDeserializer::new(®istry); |         let deserializer = UntypedReflectDeserializer::new(®istry); | ||||||
| @ -1392,12 +1501,19 @@ mod tests { | |||||||
|             map_value: map, |             map_value: map, | ||||||
|             struct_value: SomeStruct { foo: 999999999 }, |             struct_value: SomeStruct { foo: 999999999 }, | ||||||
|             tuple_struct_value: SomeTupleStruct(String::from("Tuple Struct")), |             tuple_struct_value: SomeTupleStruct(String::from("Tuple Struct")), | ||||||
|  |             unit_struct: SomeUnitStruct, | ||||||
|             unit_enum: SomeEnum::Unit, |             unit_enum: SomeEnum::Unit, | ||||||
|             newtype_enum: SomeEnum::NewType(123), |             newtype_enum: SomeEnum::NewType(123), | ||||||
|             tuple_enum: SomeEnum::Tuple(1.23, 3.21), |             tuple_enum: SomeEnum::Tuple(1.23, 3.21), | ||||||
|             struct_enum: SomeEnum::Struct { |             struct_enum: SomeEnum::Struct { | ||||||
|                 foo: String::from("Struct variant value"), |                 foo: String::from("Struct variant value"), | ||||||
|             }, |             }, | ||||||
|  |             ignored_struct: SomeIgnoredStruct { ignored: 0 }, | ||||||
|  |             ignored_tuple_struct: SomeIgnoredTupleStruct(0), | ||||||
|  |             ignored_struct_variant: SomeIgnoredEnum::Struct { | ||||||
|  |                 foo: String::default(), | ||||||
|  |             }, | ||||||
|  |             ignored_tuple_variant: SomeIgnoredEnum::Tuple(0.0, 0.0), | ||||||
|             custom_deserialize: CustomDeserialize { |             custom_deserialize: CustomDeserialize { | ||||||
|                 value: 100, |                 value: 100, | ||||||
|                 inner_struct: SomeDeserializableStruct { foo: 101 }, |                 inner_struct: SomeDeserializableStruct { foo: 101 }, | ||||||
| @ -1409,14 +1525,15 @@ mod tests { | |||||||
|         let input = vec![ |         let input = vec![ | ||||||
|             129, 217, 40, 98, 101, 118, 121, 95, 114, 101, 102, 108, 101, 99, 116, 58, 58, 115, |             129, 217, 40, 98, 101, 118, 121, 95, 114, 101, 102, 108, 101, 99, 116, 58, 58, 115, | ||||||
|             101, 114, 100, 101, 58, 58, 100, 101, 58, 58, 116, 101, 115, 116, 115, 58, 58, 77, 121, |             101, 114, 100, 101, 58, 58, 100, 101, 58, 58, 116, 101, 115, 116, 115, 58, 58, 77, 121, | ||||||
|             83, 116, 114, 117, 99, 116, 158, 123, 172, 72, 101, 108, 108, 111, 32, 119, 111, 114, |             83, 116, 114, 117, 99, 116, 220, 0, 19, 123, 172, 72, 101, 108, 108, 111, 32, 119, 111, | ||||||
|             108, 100, 33, 145, 123, 146, 202, 64, 73, 15, 219, 205, 5, 57, 149, 254, 255, 0, 1, 2, |             114, 108, 100, 33, 145, 123, 146, 202, 64, 73, 15, 219, 205, 5, 57, 149, 254, 255, 0, | ||||||
|             149, 254, 255, 0, 1, 2, 129, 64, 32, 145, 206, 59, 154, 201, 255, 145, 172, 84, 117, |             1, 2, 149, 254, 255, 0, 1, 2, 129, 64, 32, 145, 206, 59, 154, 201, 255, 145, 172, 84, | ||||||
|             112, 108, 101, 32, 83, 116, 114, 117, 99, 116, 164, 85, 110, 105, 116, 129, 167, 78, |             117, 112, 108, 101, 32, 83, 116, 114, 117, 99, 116, 144, 164, 85, 110, 105, 116, 129, | ||||||
|             101, 119, 84, 121, 112, 101, 123, 129, 165, 84, 117, 112, 108, 101, 146, 202, 63, 157, |             167, 78, 101, 119, 84, 121, 112, 101, 123, 129, 165, 84, 117, 112, 108, 101, 146, 202, | ||||||
|             112, 164, 202, 64, 77, 112, 164, 129, 166, 83, 116, 114, 117, 99, 116, 145, 180, 83, |             63, 157, 112, 164, 202, 64, 77, 112, 164, 129, 166, 83, 116, 114, 117, 99, 116, 145, | ||||||
|             116, 114, 117, 99, 116, 32, 118, 97, 114, 105, 97, 110, 116, 32, 118, 97, 108, 117, |             180, 83, 116, 114, 117, 99, 116, 32, 118, 97, 114, 105, 97, 110, 116, 32, 118, 97, 108, | ||||||
|             101, 146, 100, 145, 101, |             117, 101, 144, 144, 129, 166, 83, 116, 114, 117, 99, 116, 144, 129, 165, 84, 117, 112, | ||||||
|  |             108, 101, 144, 146, 100, 145, 101, | ||||||
|         ]; |         ]; | ||||||
| 
 | 
 | ||||||
|         let deserializer = UntypedReflectDeserializer::new(®istry); |         let deserializer = UntypedReflectDeserializer::new(®istry); | ||||||
|  | |||||||
| @ -488,10 +488,15 @@ mod tests { | |||||||
|         map_value: HashMap<u8, usize>, |         map_value: HashMap<u8, usize>, | ||||||
|         struct_value: SomeStruct, |         struct_value: SomeStruct, | ||||||
|         tuple_struct_value: SomeTupleStruct, |         tuple_struct_value: SomeTupleStruct, | ||||||
|  |         unit_struct: SomeUnitStruct, | ||||||
|         unit_enum: SomeEnum, |         unit_enum: SomeEnum, | ||||||
|         newtype_enum: SomeEnum, |         newtype_enum: SomeEnum, | ||||||
|         tuple_enum: SomeEnum, |         tuple_enum: SomeEnum, | ||||||
|         struct_enum: SomeEnum, |         struct_enum: SomeEnum, | ||||||
|  |         ignored_struct: SomeIgnoredStruct, | ||||||
|  |         ignored_tuple_struct: SomeIgnoredTupleStruct, | ||||||
|  |         ignored_struct_variant: SomeIgnoredEnum, | ||||||
|  |         ignored_tuple_variant: SomeIgnoredEnum, | ||||||
|         custom_serialize: CustomSerialize, |         custom_serialize: CustomSerialize, | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -503,6 +508,18 @@ mod tests { | |||||||
|     #[derive(Reflect, Debug, PartialEq)] |     #[derive(Reflect, Debug, PartialEq)] | ||||||
|     struct SomeTupleStruct(String); |     struct SomeTupleStruct(String); | ||||||
| 
 | 
 | ||||||
|  |     #[derive(Reflect, FromReflect, Debug, PartialEq)] | ||||||
|  |     struct SomeUnitStruct; | ||||||
|  | 
 | ||||||
|  |     #[derive(Reflect, FromReflect, Debug, PartialEq)] | ||||||
|  |     struct SomeIgnoredStruct { | ||||||
|  |         #[reflect(ignore)] | ||||||
|  |         ignored: i32, | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     #[derive(Reflect, FromReflect, Debug, PartialEq)] | ||||||
|  |     struct SomeIgnoredTupleStruct(#[reflect(ignore)] i32); | ||||||
|  | 
 | ||||||
|     #[derive(Reflect, Debug, PartialEq)] |     #[derive(Reflect, Debug, PartialEq)] | ||||||
|     enum SomeEnum { |     enum SomeEnum { | ||||||
|         Unit, |         Unit, | ||||||
| @ -511,6 +528,15 @@ mod tests { | |||||||
|         Struct { foo: String }, |         Struct { foo: String }, | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     #[derive(Reflect, FromReflect, Debug, PartialEq)] | ||||||
|  |     enum SomeIgnoredEnum { | ||||||
|  |         Tuple(#[reflect(ignore)] f32, #[reflect(ignore)] f32), | ||||||
|  |         Struct { | ||||||
|  |             #[reflect(ignore)] | ||||||
|  |             foo: String, | ||||||
|  |         }, | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     #[derive(Reflect, Debug, PartialEq, Serialize)] |     #[derive(Reflect, Debug, PartialEq, Serialize)] | ||||||
|     struct SomeSerializableStruct { |     struct SomeSerializableStruct { | ||||||
|         foo: i64, |         foo: i64, | ||||||
| @ -532,6 +558,10 @@ mod tests { | |||||||
|         registry.register::<MyStruct>(); |         registry.register::<MyStruct>(); | ||||||
|         registry.register::<SomeStruct>(); |         registry.register::<SomeStruct>(); | ||||||
|         registry.register::<SomeTupleStruct>(); |         registry.register::<SomeTupleStruct>(); | ||||||
|  |         registry.register::<SomeUnitStruct>(); | ||||||
|  |         registry.register::<SomeIgnoredStruct>(); | ||||||
|  |         registry.register::<SomeIgnoredTupleStruct>(); | ||||||
|  |         registry.register::<SomeIgnoredEnum>(); | ||||||
|         registry.register::<CustomSerialize>(); |         registry.register::<CustomSerialize>(); | ||||||
|         registry.register::<SomeEnum>(); |         registry.register::<SomeEnum>(); | ||||||
|         registry.register::<SomeSerializableStruct>(); |         registry.register::<SomeSerializableStruct>(); | ||||||
| @ -557,12 +587,19 @@ mod tests { | |||||||
|             map_value: map, |             map_value: map, | ||||||
|             struct_value: SomeStruct { foo: 999999999 }, |             struct_value: SomeStruct { foo: 999999999 }, | ||||||
|             tuple_struct_value: SomeTupleStruct(String::from("Tuple Struct")), |             tuple_struct_value: SomeTupleStruct(String::from("Tuple Struct")), | ||||||
|  |             unit_struct: SomeUnitStruct, | ||||||
|             unit_enum: SomeEnum::Unit, |             unit_enum: SomeEnum::Unit, | ||||||
|             newtype_enum: SomeEnum::NewType(123), |             newtype_enum: SomeEnum::NewType(123), | ||||||
|             tuple_enum: SomeEnum::Tuple(1.23, 3.21), |             tuple_enum: SomeEnum::Tuple(1.23, 3.21), | ||||||
|             struct_enum: SomeEnum::Struct { |             struct_enum: SomeEnum::Struct { | ||||||
|                 foo: String::from("Struct variant value"), |                 foo: String::from("Struct variant value"), | ||||||
|             }, |             }, | ||||||
|  |             ignored_struct: SomeIgnoredStruct { ignored: 123 }, | ||||||
|  |             ignored_tuple_struct: SomeIgnoredTupleStruct(123), | ||||||
|  |             ignored_struct_variant: SomeIgnoredEnum::Struct { | ||||||
|  |                 foo: String::from("Struct Variant"), | ||||||
|  |             }, | ||||||
|  |             ignored_tuple_variant: SomeIgnoredEnum::Tuple(1.23, 3.45), | ||||||
|             custom_serialize: CustomSerialize { |             custom_serialize: CustomSerialize { | ||||||
|                 value: 100, |                 value: 100, | ||||||
|                 inner_struct: SomeSerializableStruct { foo: 101 }, |                 inner_struct: SomeSerializableStruct { foo: 101 }, | ||||||
| @ -600,12 +637,17 @@ mod tests { | |||||||
|             foo: 999999999, |             foo: 999999999, | ||||||
|         ), |         ), | ||||||
|         tuple_struct_value: ("Tuple Struct"), |         tuple_struct_value: ("Tuple Struct"), | ||||||
|  |         unit_struct: (), | ||||||
|         unit_enum: Unit, |         unit_enum: Unit, | ||||||
|         newtype_enum: NewType(123), |         newtype_enum: NewType(123), | ||||||
|         tuple_enum: Tuple(1.23, 3.21), |         tuple_enum: Tuple(1.23, 3.21), | ||||||
|         struct_enum: Struct( |         struct_enum: Struct( | ||||||
|             foo: "Struct variant value", |             foo: "Struct variant value", | ||||||
|         ), |         ), | ||||||
|  |         ignored_struct: (), | ||||||
|  |         ignored_tuple_struct: (), | ||||||
|  |         ignored_struct_variant: Struct(), | ||||||
|  |         ignored_tuple_variant: Tuple(), | ||||||
|         custom_serialize: ( |         custom_serialize: ( | ||||||
|             value: 100, |             value: 100, | ||||||
|             renamed: ( |             renamed: ( | ||||||
| @ -745,12 +787,19 @@ mod tests { | |||||||
|             map_value: map, |             map_value: map, | ||||||
|             struct_value: SomeStruct { foo: 999999999 }, |             struct_value: SomeStruct { foo: 999999999 }, | ||||||
|             tuple_struct_value: SomeTupleStruct(String::from("Tuple Struct")), |             tuple_struct_value: SomeTupleStruct(String::from("Tuple Struct")), | ||||||
|  |             unit_struct: SomeUnitStruct, | ||||||
|             unit_enum: SomeEnum::Unit, |             unit_enum: SomeEnum::Unit, | ||||||
|             newtype_enum: SomeEnum::NewType(123), |             newtype_enum: SomeEnum::NewType(123), | ||||||
|             tuple_enum: SomeEnum::Tuple(1.23, 3.21), |             tuple_enum: SomeEnum::Tuple(1.23, 3.21), | ||||||
|             struct_enum: SomeEnum::Struct { |             struct_enum: SomeEnum::Struct { | ||||||
|                 foo: String::from("Struct variant value"), |                 foo: String::from("Struct variant value"), | ||||||
|             }, |             }, | ||||||
|  |             ignored_struct: SomeIgnoredStruct { ignored: 123 }, | ||||||
|  |             ignored_tuple_struct: SomeIgnoredTupleStruct(123), | ||||||
|  |             ignored_struct_variant: SomeIgnoredEnum::Struct { | ||||||
|  |                 foo: String::from("Struct Variant"), | ||||||
|  |             }, | ||||||
|  |             ignored_tuple_variant: SomeIgnoredEnum::Tuple(1.23, 3.45), | ||||||
|             custom_serialize: CustomSerialize { |             custom_serialize: CustomSerialize { | ||||||
|                 value: 100, |                 value: 100, | ||||||
|                 inner_struct: SomeSerializableStruct { foo: 101 }, |                 inner_struct: SomeSerializableStruct { foo: 101 }, | ||||||
| @ -774,7 +823,8 @@ mod tests { | |||||||
|             112, 108, 101, 32, 83, 116, 114, 117, 99, 116, 0, 0, 0, 0, 1, 0, 0, 0, 123, 0, 0, 0, 0, |             112, 108, 101, 32, 83, 116, 114, 117, 99, 116, 0, 0, 0, 0, 1, 0, 0, 0, 123, 0, 0, 0, 0, | ||||||
|             0, 0, 0, 2, 0, 0, 0, 164, 112, 157, 63, 164, 112, 77, 64, 3, 0, 0, 0, 20, 0, 0, 0, 0, |             0, 0, 0, 2, 0, 0, 0, 164, 112, 157, 63, 164, 112, 77, 64, 3, 0, 0, 0, 20, 0, 0, 0, 0, | ||||||
|             0, 0, 0, 83, 116, 114, 117, 99, 116, 32, 118, 97, 114, 105, 97, 110, 116, 32, 118, 97, |             0, 0, 0, 83, 116, 114, 117, 99, 116, 32, 118, 97, 114, 105, 97, 110, 116, 32, 118, 97, | ||||||
|             108, 117, 101, 100, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, |             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, | ||||||
|  |             0, | ||||||
|         ]; |         ]; | ||||||
| 
 | 
 | ||||||
|         assert_eq!(expected, bytes); |         assert_eq!(expected, bytes); | ||||||
| @ -795,12 +845,19 @@ mod tests { | |||||||
|             map_value: map, |             map_value: map, | ||||||
|             struct_value: SomeStruct { foo: 999999999 }, |             struct_value: SomeStruct { foo: 999999999 }, | ||||||
|             tuple_struct_value: SomeTupleStruct(String::from("Tuple Struct")), |             tuple_struct_value: SomeTupleStruct(String::from("Tuple Struct")), | ||||||
|  |             unit_struct: SomeUnitStruct, | ||||||
|             unit_enum: SomeEnum::Unit, |             unit_enum: SomeEnum::Unit, | ||||||
|             newtype_enum: SomeEnum::NewType(123), |             newtype_enum: SomeEnum::NewType(123), | ||||||
|             tuple_enum: SomeEnum::Tuple(1.23, 3.21), |             tuple_enum: SomeEnum::Tuple(1.23, 3.21), | ||||||
|             struct_enum: SomeEnum::Struct { |             struct_enum: SomeEnum::Struct { | ||||||
|                 foo: String::from("Struct variant value"), |                 foo: String::from("Struct variant value"), | ||||||
|             }, |             }, | ||||||
|  |             ignored_struct: SomeIgnoredStruct { ignored: 123 }, | ||||||
|  |             ignored_tuple_struct: SomeIgnoredTupleStruct(123), | ||||||
|  |             ignored_struct_variant: SomeIgnoredEnum::Struct { | ||||||
|  |                 foo: String::from("Struct Variant"), | ||||||
|  |             }, | ||||||
|  |             ignored_tuple_variant: SomeIgnoredEnum::Tuple(1.23, 3.45), | ||||||
|             custom_serialize: CustomSerialize { |             custom_serialize: CustomSerialize { | ||||||
|                 value: 100, |                 value: 100, | ||||||
|                 inner_struct: SomeSerializableStruct { foo: 101 }, |                 inner_struct: SomeSerializableStruct { foo: 101 }, | ||||||
| @ -815,14 +872,15 @@ mod tests { | |||||||
|         let expected: Vec<u8> = vec![ |         let expected: Vec<u8> = vec![ | ||||||
|             129, 217, 41, 98, 101, 118, 121, 95, 114, 101, 102, 108, 101, 99, 116, 58, 58, 115, |             129, 217, 41, 98, 101, 118, 121, 95, 114, 101, 102, 108, 101, 99, 116, 58, 58, 115, | ||||||
|             101, 114, 100, 101, 58, 58, 115, 101, 114, 58, 58, 116, 101, 115, 116, 115, 58, 58, 77, |             101, 114, 100, 101, 58, 58, 115, 101, 114, 58, 58, 116, 101, 115, 116, 115, 58, 58, 77, | ||||||
|             121, 83, 116, 114, 117, 99, 116, 158, 123, 172, 72, 101, 108, 108, 111, 32, 119, 111, |             121, 83, 116, 114, 117, 99, 116, 220, 0, 19, 123, 172, 72, 101, 108, 108, 111, 32, 119, | ||||||
|             114, 108, 100, 33, 145, 123, 146, 202, 64, 73, 15, 219, 205, 5, 57, 149, 254, 255, 0, |             111, 114, 108, 100, 33, 145, 123, 146, 202, 64, 73, 15, 219, 205, 5, 57, 149, 254, 255, | ||||||
|             1, 2, 149, 254, 255, 0, 1, 2, 129, 64, 32, 145, 206, 59, 154, 201, 255, 145, 172, 84, |             0, 1, 2, 149, 254, 255, 0, 1, 2, 129, 64, 32, 145, 206, 59, 154, 201, 255, 145, 172, | ||||||
|             117, 112, 108, 101, 32, 83, 116, 114, 117, 99, 116, 164, 85, 110, 105, 116, 129, 167, |             84, 117, 112, 108, 101, 32, 83, 116, 114, 117, 99, 116, 144, 164, 85, 110, 105, 116, | ||||||
|             78, 101, 119, 84, 121, 112, 101, 123, 129, 165, 84, 117, 112, 108, 101, 146, 202, 63, |             129, 167, 78, 101, 119, 84, 121, 112, 101, 123, 129, 165, 84, 117, 112, 108, 101, 146, | ||||||
|             157, 112, 164, 202, 64, 77, 112, 164, 129, 166, 83, 116, 114, 117, 99, 116, 145, 180, |             202, 63, 157, 112, 164, 202, 64, 77, 112, 164, 129, 166, 83, 116, 114, 117, 99, 116, | ||||||
|             83, 116, 114, 117, 99, 116, 32, 118, 97, 114, 105, 97, 110, 116, 32, 118, 97, 108, 117, |             145, 180, 83, 116, 114, 117, 99, 116, 32, 118, 97, 114, 105, 97, 110, 116, 32, 118, 97, | ||||||
|             101, 146, 100, 145, 101, |             108, 117, 101, 144, 144, 129, 166, 83, 116, 114, 117, 99, 116, 144, 129, 165, 84, 117, | ||||||
|  |             112, 108, 101, 144, 146, 100, 145, 101, | ||||||
|         ]; |         ]; | ||||||
| 
 | 
 | ||||||
|         assert_eq!(expected, bytes); |         assert_eq!(expected, bytes); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Gino Valente
						Gino Valente