Path: blob/main/crates/bevy_reflect/src/serde/de/mod.rs
6600 views
pub use deserialize_with_registry::*;1pub use deserializer::*;2pub use processor::*;3pub use registrations::*;45mod arrays;6mod deserialize_with_registry;7mod deserializer;8mod enums;9mod error_utils;10mod helpers;11mod lists;12mod maps;13mod options;14mod processor;15mod registration_utils;16mod registrations;17mod sets;18mod struct_utils;19mod structs;20mod tuple_structs;21mod tuple_utils;22mod tuples;2324#[cfg(test)]25mod tests {26use alloc::{27boxed::Box,28string::{String, ToString},29vec,30vec::Vec,31};32use core::{any::TypeId, f32::consts::PI, ops::RangeInclusive};33use serde::{de::DeserializeSeed, Deserialize};34use serde::{de::IgnoredAny, Deserializer};3536use bevy_platform::collections::{HashMap, HashSet};3738use crate::{39serde::{40ReflectDeserializer, ReflectDeserializerProcessor, ReflectSerializer,41TypedReflectDeserializer,42},43DynamicEnum, FromReflect, PartialReflect, Reflect, ReflectDeserialize, TypeRegistration,44TypeRegistry,45};4647#[derive(Reflect, Debug, PartialEq)]48struct MyStruct {49primitive_value: i8,50option_value: Option<String>,51option_value_complex: Option<SomeStruct>,52tuple_value: (f32, usize),53list_value: Vec<i32>,54array_value: [i32; 5],55map_value: HashMap<u8, usize>,56set_value: HashSet<u8>,57struct_value: SomeStruct,58tuple_struct_value: SomeTupleStruct,59unit_struct: SomeUnitStruct,60unit_enum: SomeEnum,61newtype_enum: SomeEnum,62tuple_enum: SomeEnum,63struct_enum: SomeEnum,64ignored_struct: SomeIgnoredStruct,65ignored_tuple_struct: SomeIgnoredTupleStruct,66ignored_struct_variant: SomeIgnoredEnum,67ignored_tuple_variant: SomeIgnoredEnum,68custom_deserialize: CustomDeserialize,69}7071#[derive(Reflect, Debug, PartialEq)]72struct SomeStruct {73foo: i64,74}7576#[derive(Reflect, Debug, PartialEq)]77struct SomeTupleStruct(String);7879#[derive(Reflect, Debug, PartialEq)]80struct SomeUnitStruct;8182#[derive(Reflect, Debug, PartialEq)]83struct SomeIgnoredStruct {84#[reflect(ignore)]85ignored: i32,86}8788#[derive(Reflect, Debug, PartialEq)]89struct SomeIgnoredTupleStruct(#[reflect(ignore)] i32);9091#[derive(Reflect, Debug, PartialEq, Deserialize)]92struct SomeDeserializableStruct {93foo: i64,94}9596/// Implements a custom deserialize using `#[reflect(Deserialize)]`.97///98/// For testing purposes, this is just the auto-generated one from deriving.99#[derive(Reflect, Debug, PartialEq, Deserialize)]100#[reflect(Deserialize)]101struct CustomDeserialize {102value: usize,103#[serde(alias = "renamed")]104inner_struct: SomeDeserializableStruct,105}106107#[derive(Reflect, Debug, PartialEq)]108enum SomeEnum {109Unit,110NewType(usize),111Tuple(f32, f32),112Struct { foo: String },113}114115#[derive(Reflect, Debug, PartialEq)]116enum SomeIgnoredEnum {117Tuple(#[reflect(ignore)] f32, #[reflect(ignore)] f32),118Struct {119#[reflect(ignore)]120foo: String,121},122}123124fn get_registry() -> TypeRegistry {125let mut registry = TypeRegistry::default();126registry.register::<MyStruct>();127registry.register::<SomeStruct>();128registry.register::<SomeTupleStruct>();129registry.register::<SomeUnitStruct>();130registry.register::<SomeIgnoredStruct>();131registry.register::<SomeIgnoredTupleStruct>();132registry.register::<CustomDeserialize>();133registry.register::<SomeDeserializableStruct>();134registry.register::<SomeEnum>();135registry.register::<SomeIgnoredEnum>();136registry.register::<i8>();137registry.register::<String>();138registry.register::<i64>();139registry.register::<f32>();140registry.register::<usize>();141registry.register::<i32>();142registry.register::<u8>();143registry.register::<(f32, usize)>();144registry.register::<[i32; 5]>();145registry.register::<Vec<i32>>();146registry.register::<HashMap<u8, usize>>();147registry.register::<HashSet<u8>>();148registry.register::<Option<SomeStruct>>();149registry.register::<Option<String>>();150registry.register_type_data::<Option<String>, ReflectDeserialize>();151registry152}153154fn get_my_struct() -> MyStruct {155let mut map = <HashMap<_, _>>::default();156map.insert(64, 32);157158let mut set = <HashSet<_>>::default();159set.insert(64);160161MyStruct {162primitive_value: 123,163option_value: Some(String::from("Hello world!")),164option_value_complex: Some(SomeStruct { foo: 123 }),165tuple_value: (PI, 1337),166list_value: vec![-2, -1, 0, 1, 2],167array_value: [-2, -1, 0, 1, 2],168map_value: map,169set_value: set,170struct_value: SomeStruct { foo: 999999999 },171tuple_struct_value: SomeTupleStruct(String::from("Tuple Struct")),172unit_struct: SomeUnitStruct,173unit_enum: SomeEnum::Unit,174newtype_enum: SomeEnum::NewType(123),175tuple_enum: SomeEnum::Tuple(1.23, 3.21),176struct_enum: SomeEnum::Struct {177foo: String::from("Struct variant value"),178},179ignored_struct: SomeIgnoredStruct { ignored: 0 },180ignored_tuple_struct: SomeIgnoredTupleStruct(0),181ignored_struct_variant: SomeIgnoredEnum::Struct {182foo: String::default(),183},184ignored_tuple_variant: SomeIgnoredEnum::Tuple(0.0, 0.0),185custom_deserialize: CustomDeserialize {186value: 100,187inner_struct: SomeDeserializableStruct { foo: 101 },188},189}190}191192#[test]193fn should_deserialize() {194let expected = get_my_struct();195let registry = get_registry();196197let input = r#"{198"bevy_reflect::serde::de::tests::MyStruct": (199primitive_value: 123,200option_value: Some("Hello world!"),201option_value_complex: Some((202foo: 123,203)),204tuple_value: (3.1415927, 1337),205list_value: [206-2,207-1,2080,2091,2102,211],212array_value: (-2, -1, 0, 1, 2),213map_value: {21464: 32,215},216set_value: [21764,218],219struct_value: (220foo: 999999999,221),222tuple_struct_value: ("Tuple Struct"),223unit_struct: (),224unit_enum: Unit,225newtype_enum: NewType(123),226tuple_enum: Tuple(1.23, 3.21),227struct_enum: Struct(228foo: "Struct variant value",229),230ignored_struct: (),231ignored_tuple_struct: (),232ignored_struct_variant: Struct(),233ignored_tuple_variant: Tuple(),234custom_deserialize: (235value: 100,236renamed: (237foo: 101,238),239),240),241}"#;242243let reflect_deserializer = ReflectDeserializer::new(®istry);244let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();245let dynamic_output = reflect_deserializer246.deserialize(&mut ron_deserializer)247.unwrap();248249let output = <MyStruct as FromReflect>::from_reflect(dynamic_output.as_ref()).unwrap();250assert_eq!(expected, output);251}252253#[test]254fn should_deserialize_value() {255let input = r#"{256"f32": 1.23,257}"#;258259let registry = get_registry();260let reflect_deserializer = ReflectDeserializer::new(®istry);261let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();262let dynamic_output = reflect_deserializer263.deserialize(&mut ron_deserializer)264.unwrap();265let output = dynamic_output266.try_take::<f32>()267.expect("underlying type should be f32");268assert_eq!(1.23, output);269}270271#[test]272fn should_deserialized_typed() {273#[derive(Reflect, Debug, PartialEq)]274struct Foo {275bar: i32,276}277278let expected = Foo { bar: 123 };279280let input = r#"(281bar: 123282)"#;283284let mut registry = get_registry();285registry.register::<Foo>();286let registration = registry.get(TypeId::of::<Foo>()).unwrap();287let reflect_deserializer = TypedReflectDeserializer::new(registration, ®istry);288let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();289let dynamic_output = reflect_deserializer290.deserialize(&mut ron_deserializer)291.unwrap();292293let output =294<Foo as FromReflect>::from_reflect(dynamic_output.as_partial_reflect()).unwrap();295assert_eq!(expected, output);296}297298#[test]299fn should_deserialize_option() {300#[derive(Reflect, Debug, PartialEq)]301struct OptionTest {302none: Option<()>,303simple: Option<String>,304complex: Option<SomeStruct>,305}306307let expected = OptionTest {308none: None,309simple: Some(String::from("Hello world!")),310complex: Some(SomeStruct { foo: 123 }),311};312313let mut registry = get_registry();314registry.register::<OptionTest>();315registry.register::<Option<()>>();316317// === Normal === //318let input = r#"{319"bevy_reflect::serde::de::tests::OptionTest": (320none: None,321simple: Some("Hello world!"),322complex: Some((323foo: 123,324)),325),326}"#;327328let reflect_deserializer = ReflectDeserializer::new(®istry);329let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();330let dynamic_output = reflect_deserializer331.deserialize(&mut ron_deserializer)332.unwrap();333334let output = <OptionTest as FromReflect>::from_reflect(dynamic_output.as_ref()).unwrap();335assert_eq!(expected, output, "failed to deserialize Options");336337// === Implicit Some === //338let input = r#"339#![enable(implicit_some)]340{341"bevy_reflect::serde::de::tests::OptionTest": (342none: None,343simple: "Hello world!",344complex: (345foo: 123,346),347),348}"#;349350let reflect_deserializer = ReflectDeserializer::new(®istry);351let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();352let dynamic_output = reflect_deserializer353.deserialize(&mut ron_deserializer)354.unwrap();355356let output = <OptionTest as FromReflect>::from_reflect(dynamic_output.as_ref()).unwrap();357assert_eq!(358expected, output,359"failed to deserialize Options with implicit Some"360);361}362363#[test]364fn enum_should_deserialize() {365#[derive(Reflect)]366enum MyEnum {367Unit,368NewType(usize),369Tuple(f32, f32),370Struct { value: String },371}372373let mut registry = get_registry();374registry.register::<MyEnum>();375376// === Unit Variant === //377let input = r#"{378"bevy_reflect::serde::de::tests::MyEnum": Unit,379}"#;380let reflect_deserializer = ReflectDeserializer::new(®istry);381let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();382let output = reflect_deserializer.deserialize(&mut deserializer).unwrap();383384let expected = DynamicEnum::from(MyEnum::Unit);385assert!(expected.reflect_partial_eq(output.as_ref()).unwrap());386387// === NewType Variant === //388let input = r#"{389"bevy_reflect::serde::de::tests::MyEnum": NewType(123),390}"#;391let reflect_deserializer = ReflectDeserializer::new(®istry);392let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();393let output = reflect_deserializer.deserialize(&mut deserializer).unwrap();394395let expected = DynamicEnum::from(MyEnum::NewType(123));396assert!(expected.reflect_partial_eq(output.as_ref()).unwrap());397398// === Tuple Variant === //399let input = r#"{400"bevy_reflect::serde::de::tests::MyEnum": Tuple(1.23, 3.21),401}"#;402let reflect_deserializer = ReflectDeserializer::new(®istry);403let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();404let output = reflect_deserializer.deserialize(&mut deserializer).unwrap();405406let expected = DynamicEnum::from(MyEnum::Tuple(1.23, 3.21));407assert!(expected408.reflect_partial_eq(output.as_partial_reflect())409.unwrap());410411// === Struct Variant === //412let input = r#"{413"bevy_reflect::serde::de::tests::MyEnum": Struct(414value: "I <3 Enums",415),416}"#;417let reflect_deserializer = ReflectDeserializer::new(®istry);418let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();419let output = reflect_deserializer.deserialize(&mut deserializer).unwrap();420421let expected = DynamicEnum::from(MyEnum::Struct {422value: String::from("I <3 Enums"),423});424assert!(expected425.reflect_partial_eq(output.as_partial_reflect())426.unwrap());427}428429// Regression test for https://github.com/bevyengine/bevy/issues/12462430#[test]431fn should_reserialize() {432let registry = get_registry();433let input1 = get_my_struct();434435let serializer1 = ReflectSerializer::new(&input1, ®istry);436let serialized1 = ron::ser::to_string(&serializer1).unwrap();437438let mut deserializer = ron::de::Deserializer::from_str(&serialized1).unwrap();439let reflect_deserializer = ReflectDeserializer::new(®istry);440let input2 = reflect_deserializer.deserialize(&mut deserializer).unwrap();441442let serializer2 = ReflectSerializer::new(input2.as_partial_reflect(), ®istry);443let serialized2 = ron::ser::to_string(&serializer2).unwrap();444445assert_eq!(serialized1, serialized2);446}447448#[test]449fn should_deserialize_non_self_describing_binary() {450let expected = get_my_struct();451let registry = get_registry();452453let input = vec![4541, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 98, 101, 118, 121, 95, 114, 101, 102,455108, 101, 99, 116, 58, 58, 115, 101, 114, 100, 101, 58, 58, 100, 101, 58, 58, 116, 101,456115, 116, 115, 58, 58, 77, 121, 83, 116, 114, 117, 99, 116, 123, 1, 12, 0, 0, 0, 0, 0,4570, 0, 72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 33, 1, 123, 0, 0, 0, 0, 0,4580, 0, 219, 15, 73, 64, 57, 5, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 254, 255, 255,459255, 255, 255, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 254, 255, 255, 255, 255,460255, 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,4610, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 255, 201, 154, 59, 0, 0, 0, 0, 12, 0, 0,4620, 0, 0, 0, 0, 84, 117, 112, 108, 101, 32, 83, 116, 114, 117, 99, 116, 0, 0, 0, 0, 1,4630, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 164, 112, 157, 63, 164, 112, 77, 64, 3,4640, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 83, 116, 114, 117, 99, 116, 32, 118, 97, 114, 105,46597, 110, 116, 32, 118, 97, 108, 117, 101, 1, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0,4660, 0, 101, 0, 0, 0, 0, 0, 0, 0,467];468469let deserializer = ReflectDeserializer::new(®istry);470471let config = bincode::config::standard().with_fixed_int_encoding();472let (dynamic_output, _read_bytes) =473bincode::serde::seed_decode_from_slice(deserializer, &input, config).unwrap();474475let output = <MyStruct as FromReflect>::from_reflect(dynamic_output.as_ref()).unwrap();476assert_eq!(expected, output);477}478479#[test]480fn should_deserialize_self_describing_binary() {481let expected = get_my_struct();482483let registry = get_registry();484485let input = vec![486129, 217, 40, 98, 101, 118, 121, 95, 114, 101, 102, 108, 101, 99, 116, 58, 58, 115,487101, 114, 100, 101, 58, 58, 100, 101, 58, 58, 116, 101, 115, 116, 115, 58, 58, 77, 121,48883, 116, 114, 117, 99, 116, 220, 0, 20, 123, 172, 72, 101, 108, 108, 111, 32, 119, 111,489114, 108, 100, 33, 145, 123, 146, 202, 64, 73, 15, 219, 205, 5, 57, 149, 254, 255, 0,4901, 2, 149, 254, 255, 0, 1, 2, 129, 64, 32, 145, 64, 145, 206, 59, 154, 201, 255, 172,49184, 117, 112, 108, 101, 32, 83, 116, 114, 117, 99, 116, 144, 164, 85, 110, 105, 116,492129, 167, 78, 101, 119, 84, 121, 112, 101, 123, 129, 165, 84, 117, 112, 108, 101, 146,493202, 63, 157, 112, 164, 202, 64, 77, 112, 164, 129, 166, 83, 116, 114, 117, 99, 116,494145, 180, 83, 116, 114, 117, 99, 116, 32, 118, 97, 114, 105, 97, 110, 116, 32, 118, 97,495108, 117, 101, 144, 144, 129, 166, 83, 116, 114, 117, 99, 116, 144, 129, 165, 84, 117,496112, 108, 101, 144, 146, 100, 145, 101,497];498499let mut reader = std::io::BufReader::new(input.as_slice());500501let deserializer = ReflectDeserializer::new(®istry);502let dynamic_output = deserializer503.deserialize(&mut rmp_serde::Deserializer::new(&mut reader))504.unwrap();505506let output = <MyStruct as FromReflect>::from_reflect(dynamic_output.as_ref()).unwrap();507assert_eq!(expected, output);508}509510#[test]511fn should_return_error_if_missing_type_data() {512let mut registry = TypeRegistry::new();513registry.register::<RangeInclusive<f32>>();514515let input = r#"{"core::ops::RangeInclusive<f32>":(start:0.0,end:1.0)}"#;516let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();517let reflect_deserializer = ReflectDeserializer::new(®istry);518let error = reflect_deserializer519.deserialize(&mut deserializer)520.unwrap_err();521#[cfg(feature = "debug_stack")]522assert_eq!(error, ron::Error::Message("type `core::ops::RangeInclusive<f32>` did not register the `ReflectDeserialize` type data. For certain types, this may need to be registered manually using `register_type_data` (stack: `core::ops::RangeInclusive<f32>`)".to_string()));523#[cfg(not(feature = "debug_stack"))]524assert_eq!(error, ron::Error::Message("type `core::ops::RangeInclusive<f32>` did not register the `ReflectDeserialize` type data. For certain types, this may need to be registered manually using `register_type_data`".to_string()));525}526527#[test]528fn should_use_processor_for_custom_deserialization() {529#[derive(Reflect, Debug, PartialEq)]530struct Foo {531bar: i32,532qux: i64,533}534535struct FooProcessor;536537impl ReflectDeserializerProcessor for FooProcessor {538fn try_deserialize<'de, D>(539&mut self,540registration: &TypeRegistration,541_: &TypeRegistry,542deserializer: D,543) -> Result<Result<Box<dyn PartialReflect>, D>, D::Error>544where545D: Deserializer<'de>,546{547if registration.type_id() == TypeId::of::<i64>() {548let _ = deserializer.deserialize_ignored_any(IgnoredAny);549Ok(Ok(Box::new(456_i64)))550} else {551Ok(Err(deserializer))552}553}554}555556let expected = Foo { bar: 123, qux: 456 };557558let input = r#"(559bar: 123,560qux: 123,561)"#;562563let mut registry = get_registry();564registry.register::<Foo>();565let registration = registry.get(TypeId::of::<Foo>()).unwrap();566let mut processor = FooProcessor;567let reflect_deserializer =568TypedReflectDeserializer::with_processor(registration, ®istry, &mut processor);569let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();570let dynamic_output = reflect_deserializer571.deserialize(&mut ron_deserializer)572.unwrap();573574let output =575<Foo as FromReflect>::from_reflect(dynamic_output.as_partial_reflect()).unwrap();576assert_eq!(expected, output);577}578579#[test]580fn should_use_processor_for_multiple_registrations() {581#[derive(Reflect, Debug, PartialEq)]582struct Foo {583bar: i32,584qux: i64,585}586587struct FooProcessor;588589impl ReflectDeserializerProcessor for FooProcessor {590fn try_deserialize<'de, D>(591&mut self,592registration: &TypeRegistration,593_: &TypeRegistry,594deserializer: D,595) -> Result<Result<Box<dyn PartialReflect>, D>, D::Error>596where597D: Deserializer<'de>,598{599if registration.type_id() == TypeId::of::<i32>() {600let _ = deserializer.deserialize_ignored_any(IgnoredAny);601Ok(Ok(Box::new(123_i32)))602} else if registration.type_id() == TypeId::of::<i64>() {603let _ = deserializer.deserialize_ignored_any(IgnoredAny);604Ok(Ok(Box::new(456_i64)))605} else {606Ok(Err(deserializer))607}608}609}610611let expected = Foo { bar: 123, qux: 456 };612613let input = r#"(614bar: 0,615qux: 0,616)"#;617618let mut registry = get_registry();619registry.register::<Foo>();620let registration = registry.get(TypeId::of::<Foo>()).unwrap();621let mut processor = FooProcessor;622let reflect_deserializer =623TypedReflectDeserializer::with_processor(registration, ®istry, &mut processor);624let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();625let dynamic_output = reflect_deserializer626.deserialize(&mut ron_deserializer)627.unwrap();628629let output =630<Foo as FromReflect>::from_reflect(dynamic_output.as_partial_reflect()).unwrap();631assert_eq!(expected, output);632}633634#[test]635fn should_propagate_processor_deserialize_error() {636struct ErroringProcessor;637638impl ReflectDeserializerProcessor for ErroringProcessor {639fn try_deserialize<'de, D>(640&mut self,641registration: &TypeRegistration,642_: &TypeRegistry,643deserializer: D,644) -> Result<Result<Box<dyn PartialReflect>, D>, D::Error>645where646D: Deserializer<'de>,647{648if registration.type_id() == TypeId::of::<i32>() {649Err(serde::de::Error::custom("my custom deserialize error"))650} else {651Ok(Err(deserializer))652}653}654}655656let registry = get_registry();657658let input = r#"{"i32":123}"#;659let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();660let mut processor = ErroringProcessor;661let reflect_deserializer = ReflectDeserializer::with_processor(®istry, &mut processor);662let error = reflect_deserializer663.deserialize(&mut deserializer)664.unwrap_err();665666#[cfg(feature = "debug_stack")]667assert_eq!(668error,669ron::Error::Message("my custom deserialize error (stack: `i32`)".to_string())670);671#[cfg(not(feature = "debug_stack"))]672assert_eq!(673error,674ron::Error::Message("my custom deserialize error".to_string())675);676}677678#[test]679fn should_access_local_scope_in_processor() {680struct ValueCountingProcessor<'a> {681values_found: &'a mut usize,682}683684impl ReflectDeserializerProcessor for ValueCountingProcessor<'_> {685fn try_deserialize<'de, D>(686&mut self,687_: &TypeRegistration,688_: &TypeRegistry,689deserializer: D,690) -> Result<Result<Box<dyn PartialReflect>, D>, D::Error>691where692D: Deserializer<'de>,693{694let _ = deserializer.deserialize_ignored_any(IgnoredAny)?;695*self.values_found += 1;696Ok(Ok(Box::new(123_i32)))697}698}699700let registry = get_registry();701702let input = r#"{"i32":0}"#;703704let mut values_found = 0_usize;705let mut deserializer_processor = ValueCountingProcessor {706values_found: &mut values_found,707};708709let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();710let reflect_deserializer =711ReflectDeserializer::with_processor(®istry, &mut deserializer_processor);712reflect_deserializer.deserialize(&mut deserializer).unwrap();713assert_eq!(1, values_found);714}715716#[test]717fn should_fail_from_reflect_if_processor_returns_wrong_typed_value() {718#[derive(Reflect, Debug, PartialEq)]719struct Foo {720bar: i32,721qux: i64,722}723724struct WrongTypeProcessor;725726impl ReflectDeserializerProcessor for WrongTypeProcessor {727fn try_deserialize<'de, D>(728&mut self,729registration: &TypeRegistration,730_registry: &TypeRegistry,731deserializer: D,732) -> Result<Result<Box<dyn PartialReflect>, D>, D::Error>733where734D: Deserializer<'de>,735{736if registration.type_id() == TypeId::of::<i32>() {737let _ = deserializer.deserialize_ignored_any(IgnoredAny);738Ok(Ok(Box::new(42_i64)))739} else {740Ok(Err(deserializer))741}742}743}744745let input = r#"(746bar: 123,747qux: 123,748)"#;749750let mut registry = get_registry();751registry.register::<Foo>();752let registration = registry.get(TypeId::of::<Foo>()).unwrap();753let mut processor = WrongTypeProcessor;754let reflect_deserializer =755TypedReflectDeserializer::with_processor(registration, ®istry, &mut processor);756let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();757let dynamic_output = reflect_deserializer758.deserialize(&mut ron_deserializer)759.unwrap();760761assert!(<Foo as FromReflect>::from_reflect(dynamic_output.as_partial_reflect()).is_none());762}763764#[cfg(feature = "functions")]765mod functions {766use super::*;767use crate::func::DynamicFunction;768769#[test]770fn should_not_deserialize_function() {771#[derive(Reflect)]772#[reflect(from_reflect = false)]773struct MyStruct {774func: DynamicFunction<'static>,775}776777let mut registry = TypeRegistry::new();778registry.register::<MyStruct>();779780let input = r#"{781"bevy_reflect::serde::de::tests::functions::MyStruct": (782func: (),783),784}"#;785786let reflect_deserializer = ReflectDeserializer::new(®istry);787let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();788789let error = reflect_deserializer790.deserialize(&mut ron_deserializer)791.unwrap_err();792793#[cfg(feature = "debug_stack")]794assert_eq!(795error,796ron::Error::Message(797"no registration found for type `bevy_reflect::DynamicFunction` (stack: `bevy_reflect::serde::de::tests::functions::MyStruct`)"798.to_string()799)800);801802#[cfg(not(feature = "debug_stack"))]803assert_eq!(804error,805ron::Error::Message(806"no registration found for type `bevy_reflect::DynamicFunction`".to_string()807)808);809}810}811812#[cfg(feature = "debug_stack")]813mod debug_stack {814use super::*;815816#[test]817fn should_report_context_in_errors() {818#[derive(Reflect)]819struct Foo {820bar: Bar,821}822823#[derive(Reflect)]824struct Bar {825some_other_field: Option<u32>,826baz: Baz,827}828829#[derive(Reflect)]830struct Baz {831value: Vec<RangeInclusive<f32>>,832}833834let mut registry = TypeRegistry::new();835registry.register::<Foo>();836registry.register::<Bar>();837registry.register::<Baz>();838registry.register::<RangeInclusive<f32>>();839840let input = r#"{"bevy_reflect::serde::de::tests::debug_stack::Foo":(bar:(some_other_field:Some(123),baz:(value:[(start:0.0,end:1.0)])))}"#;841let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();842let reflect_deserializer = ReflectDeserializer::new(®istry);843let error = reflect_deserializer844.deserialize(&mut deserializer)845.unwrap_err();846assert_eq!(847error,848ron::Error::Message(849"type `core::ops::RangeInclusive<f32>` did not register the `ReflectDeserialize` type data. For certain types, this may need to be registered manually using `register_type_data` (stack: `bevy_reflect::serde::de::tests::debug_stack::Foo` -> `bevy_reflect::serde::de::tests::debug_stack::Bar` -> `bevy_reflect::serde::de::tests::debug_stack::Baz` -> `alloc::vec::Vec<core::ops::RangeInclusive<f32>>` -> `core::ops::RangeInclusive<f32>`)".to_string()850)851);852}853}854}855856857