Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_reflect/src/serde/de/mod.rs
6600 views
1
pub use deserialize_with_registry::*;
2
pub use deserializer::*;
3
pub use processor::*;
4
pub use registrations::*;
5
6
mod arrays;
7
mod deserialize_with_registry;
8
mod deserializer;
9
mod enums;
10
mod error_utils;
11
mod helpers;
12
mod lists;
13
mod maps;
14
mod options;
15
mod processor;
16
mod registration_utils;
17
mod registrations;
18
mod sets;
19
mod struct_utils;
20
mod structs;
21
mod tuple_structs;
22
mod tuple_utils;
23
mod tuples;
24
25
#[cfg(test)]
26
mod tests {
27
use alloc::{
28
boxed::Box,
29
string::{String, ToString},
30
vec,
31
vec::Vec,
32
};
33
use core::{any::TypeId, f32::consts::PI, ops::RangeInclusive};
34
use serde::{de::DeserializeSeed, Deserialize};
35
use serde::{de::IgnoredAny, Deserializer};
36
37
use bevy_platform::collections::{HashMap, HashSet};
38
39
use crate::{
40
serde::{
41
ReflectDeserializer, ReflectDeserializerProcessor, ReflectSerializer,
42
TypedReflectDeserializer,
43
},
44
DynamicEnum, FromReflect, PartialReflect, Reflect, ReflectDeserialize, TypeRegistration,
45
TypeRegistry,
46
};
47
48
#[derive(Reflect, Debug, PartialEq)]
49
struct MyStruct {
50
primitive_value: i8,
51
option_value: Option<String>,
52
option_value_complex: Option<SomeStruct>,
53
tuple_value: (f32, usize),
54
list_value: Vec<i32>,
55
array_value: [i32; 5],
56
map_value: HashMap<u8, usize>,
57
set_value: HashSet<u8>,
58
struct_value: SomeStruct,
59
tuple_struct_value: SomeTupleStruct,
60
unit_struct: SomeUnitStruct,
61
unit_enum: SomeEnum,
62
newtype_enum: SomeEnum,
63
tuple_enum: SomeEnum,
64
struct_enum: SomeEnum,
65
ignored_struct: SomeIgnoredStruct,
66
ignored_tuple_struct: SomeIgnoredTupleStruct,
67
ignored_struct_variant: SomeIgnoredEnum,
68
ignored_tuple_variant: SomeIgnoredEnum,
69
custom_deserialize: CustomDeserialize,
70
}
71
72
#[derive(Reflect, Debug, PartialEq)]
73
struct SomeStruct {
74
foo: i64,
75
}
76
77
#[derive(Reflect, Debug, PartialEq)]
78
struct SomeTupleStruct(String);
79
80
#[derive(Reflect, Debug, PartialEq)]
81
struct SomeUnitStruct;
82
83
#[derive(Reflect, Debug, PartialEq)]
84
struct SomeIgnoredStruct {
85
#[reflect(ignore)]
86
ignored: i32,
87
}
88
89
#[derive(Reflect, Debug, PartialEq)]
90
struct SomeIgnoredTupleStruct(#[reflect(ignore)] i32);
91
92
#[derive(Reflect, Debug, PartialEq, Deserialize)]
93
struct SomeDeserializableStruct {
94
foo: i64,
95
}
96
97
/// Implements a custom deserialize using `#[reflect(Deserialize)]`.
98
///
99
/// For testing purposes, this is just the auto-generated one from deriving.
100
#[derive(Reflect, Debug, PartialEq, Deserialize)]
101
#[reflect(Deserialize)]
102
struct CustomDeserialize {
103
value: usize,
104
#[serde(alias = "renamed")]
105
inner_struct: SomeDeserializableStruct,
106
}
107
108
#[derive(Reflect, Debug, PartialEq)]
109
enum SomeEnum {
110
Unit,
111
NewType(usize),
112
Tuple(f32, f32),
113
Struct { foo: String },
114
}
115
116
#[derive(Reflect, Debug, PartialEq)]
117
enum SomeIgnoredEnum {
118
Tuple(#[reflect(ignore)] f32, #[reflect(ignore)] f32),
119
Struct {
120
#[reflect(ignore)]
121
foo: String,
122
},
123
}
124
125
fn get_registry() -> TypeRegistry {
126
let mut registry = TypeRegistry::default();
127
registry.register::<MyStruct>();
128
registry.register::<SomeStruct>();
129
registry.register::<SomeTupleStruct>();
130
registry.register::<SomeUnitStruct>();
131
registry.register::<SomeIgnoredStruct>();
132
registry.register::<SomeIgnoredTupleStruct>();
133
registry.register::<CustomDeserialize>();
134
registry.register::<SomeDeserializableStruct>();
135
registry.register::<SomeEnum>();
136
registry.register::<SomeIgnoredEnum>();
137
registry.register::<i8>();
138
registry.register::<String>();
139
registry.register::<i64>();
140
registry.register::<f32>();
141
registry.register::<usize>();
142
registry.register::<i32>();
143
registry.register::<u8>();
144
registry.register::<(f32, usize)>();
145
registry.register::<[i32; 5]>();
146
registry.register::<Vec<i32>>();
147
registry.register::<HashMap<u8, usize>>();
148
registry.register::<HashSet<u8>>();
149
registry.register::<Option<SomeStruct>>();
150
registry.register::<Option<String>>();
151
registry.register_type_data::<Option<String>, ReflectDeserialize>();
152
registry
153
}
154
155
fn get_my_struct() -> MyStruct {
156
let mut map = <HashMap<_, _>>::default();
157
map.insert(64, 32);
158
159
let mut set = <HashSet<_>>::default();
160
set.insert(64);
161
162
MyStruct {
163
primitive_value: 123,
164
option_value: Some(String::from("Hello world!")),
165
option_value_complex: Some(SomeStruct { foo: 123 }),
166
tuple_value: (PI, 1337),
167
list_value: vec![-2, -1, 0, 1, 2],
168
array_value: [-2, -1, 0, 1, 2],
169
map_value: map,
170
set_value: set,
171
struct_value: SomeStruct { foo: 999999999 },
172
tuple_struct_value: SomeTupleStruct(String::from("Tuple Struct")),
173
unit_struct: SomeUnitStruct,
174
unit_enum: SomeEnum::Unit,
175
newtype_enum: SomeEnum::NewType(123),
176
tuple_enum: SomeEnum::Tuple(1.23, 3.21),
177
struct_enum: SomeEnum::Struct {
178
foo: String::from("Struct variant value"),
179
},
180
ignored_struct: SomeIgnoredStruct { ignored: 0 },
181
ignored_tuple_struct: SomeIgnoredTupleStruct(0),
182
ignored_struct_variant: SomeIgnoredEnum::Struct {
183
foo: String::default(),
184
},
185
ignored_tuple_variant: SomeIgnoredEnum::Tuple(0.0, 0.0),
186
custom_deserialize: CustomDeserialize {
187
value: 100,
188
inner_struct: SomeDeserializableStruct { foo: 101 },
189
},
190
}
191
}
192
193
#[test]
194
fn should_deserialize() {
195
let expected = get_my_struct();
196
let registry = get_registry();
197
198
let input = r#"{
199
"bevy_reflect::serde::de::tests::MyStruct": (
200
primitive_value: 123,
201
option_value: Some("Hello world!"),
202
option_value_complex: Some((
203
foo: 123,
204
)),
205
tuple_value: (3.1415927, 1337),
206
list_value: [
207
-2,
208
-1,
209
0,
210
1,
211
2,
212
],
213
array_value: (-2, -1, 0, 1, 2),
214
map_value: {
215
64: 32,
216
},
217
set_value: [
218
64,
219
],
220
struct_value: (
221
foo: 999999999,
222
),
223
tuple_struct_value: ("Tuple Struct"),
224
unit_struct: (),
225
unit_enum: Unit,
226
newtype_enum: NewType(123),
227
tuple_enum: Tuple(1.23, 3.21),
228
struct_enum: Struct(
229
foo: "Struct variant value",
230
),
231
ignored_struct: (),
232
ignored_tuple_struct: (),
233
ignored_struct_variant: Struct(),
234
ignored_tuple_variant: Tuple(),
235
custom_deserialize: (
236
value: 100,
237
renamed: (
238
foo: 101,
239
),
240
),
241
),
242
}"#;
243
244
let reflect_deserializer = ReflectDeserializer::new(&registry);
245
let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();
246
let dynamic_output = reflect_deserializer
247
.deserialize(&mut ron_deserializer)
248
.unwrap();
249
250
let output = <MyStruct as FromReflect>::from_reflect(dynamic_output.as_ref()).unwrap();
251
assert_eq!(expected, output);
252
}
253
254
#[test]
255
fn should_deserialize_value() {
256
let input = r#"{
257
"f32": 1.23,
258
}"#;
259
260
let registry = get_registry();
261
let reflect_deserializer = ReflectDeserializer::new(&registry);
262
let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();
263
let dynamic_output = reflect_deserializer
264
.deserialize(&mut ron_deserializer)
265
.unwrap();
266
let output = dynamic_output
267
.try_take::<f32>()
268
.expect("underlying type should be f32");
269
assert_eq!(1.23, output);
270
}
271
272
#[test]
273
fn should_deserialized_typed() {
274
#[derive(Reflect, Debug, PartialEq)]
275
struct Foo {
276
bar: i32,
277
}
278
279
let expected = Foo { bar: 123 };
280
281
let input = r#"(
282
bar: 123
283
)"#;
284
285
let mut registry = get_registry();
286
registry.register::<Foo>();
287
let registration = registry.get(TypeId::of::<Foo>()).unwrap();
288
let reflect_deserializer = TypedReflectDeserializer::new(registration, &registry);
289
let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();
290
let dynamic_output = reflect_deserializer
291
.deserialize(&mut ron_deserializer)
292
.unwrap();
293
294
let output =
295
<Foo as FromReflect>::from_reflect(dynamic_output.as_partial_reflect()).unwrap();
296
assert_eq!(expected, output);
297
}
298
299
#[test]
300
fn should_deserialize_option() {
301
#[derive(Reflect, Debug, PartialEq)]
302
struct OptionTest {
303
none: Option<()>,
304
simple: Option<String>,
305
complex: Option<SomeStruct>,
306
}
307
308
let expected = OptionTest {
309
none: None,
310
simple: Some(String::from("Hello world!")),
311
complex: Some(SomeStruct { foo: 123 }),
312
};
313
314
let mut registry = get_registry();
315
registry.register::<OptionTest>();
316
registry.register::<Option<()>>();
317
318
// === Normal === //
319
let input = r#"{
320
"bevy_reflect::serde::de::tests::OptionTest": (
321
none: None,
322
simple: Some("Hello world!"),
323
complex: Some((
324
foo: 123,
325
)),
326
),
327
}"#;
328
329
let reflect_deserializer = ReflectDeserializer::new(&registry);
330
let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();
331
let dynamic_output = reflect_deserializer
332
.deserialize(&mut ron_deserializer)
333
.unwrap();
334
335
let output = <OptionTest as FromReflect>::from_reflect(dynamic_output.as_ref()).unwrap();
336
assert_eq!(expected, output, "failed to deserialize Options");
337
338
// === Implicit Some === //
339
let input = r#"
340
#![enable(implicit_some)]
341
{
342
"bevy_reflect::serde::de::tests::OptionTest": (
343
none: None,
344
simple: "Hello world!",
345
complex: (
346
foo: 123,
347
),
348
),
349
}"#;
350
351
let reflect_deserializer = ReflectDeserializer::new(&registry);
352
let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();
353
let dynamic_output = reflect_deserializer
354
.deserialize(&mut ron_deserializer)
355
.unwrap();
356
357
let output = <OptionTest as FromReflect>::from_reflect(dynamic_output.as_ref()).unwrap();
358
assert_eq!(
359
expected, output,
360
"failed to deserialize Options with implicit Some"
361
);
362
}
363
364
#[test]
365
fn enum_should_deserialize() {
366
#[derive(Reflect)]
367
enum MyEnum {
368
Unit,
369
NewType(usize),
370
Tuple(f32, f32),
371
Struct { value: String },
372
}
373
374
let mut registry = get_registry();
375
registry.register::<MyEnum>();
376
377
// === Unit Variant === //
378
let input = r#"{
379
"bevy_reflect::serde::de::tests::MyEnum": Unit,
380
}"#;
381
let reflect_deserializer = ReflectDeserializer::new(&registry);
382
let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();
383
let output = reflect_deserializer.deserialize(&mut deserializer).unwrap();
384
385
let expected = DynamicEnum::from(MyEnum::Unit);
386
assert!(expected.reflect_partial_eq(output.as_ref()).unwrap());
387
388
// === NewType Variant === //
389
let input = r#"{
390
"bevy_reflect::serde::de::tests::MyEnum": NewType(123),
391
}"#;
392
let reflect_deserializer = ReflectDeserializer::new(&registry);
393
let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();
394
let output = reflect_deserializer.deserialize(&mut deserializer).unwrap();
395
396
let expected = DynamicEnum::from(MyEnum::NewType(123));
397
assert!(expected.reflect_partial_eq(output.as_ref()).unwrap());
398
399
// === Tuple Variant === //
400
let input = r#"{
401
"bevy_reflect::serde::de::tests::MyEnum": Tuple(1.23, 3.21),
402
}"#;
403
let reflect_deserializer = ReflectDeserializer::new(&registry);
404
let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();
405
let output = reflect_deserializer.deserialize(&mut deserializer).unwrap();
406
407
let expected = DynamicEnum::from(MyEnum::Tuple(1.23, 3.21));
408
assert!(expected
409
.reflect_partial_eq(output.as_partial_reflect())
410
.unwrap());
411
412
// === Struct Variant === //
413
let input = r#"{
414
"bevy_reflect::serde::de::tests::MyEnum": Struct(
415
value: "I <3 Enums",
416
),
417
}"#;
418
let reflect_deserializer = ReflectDeserializer::new(&registry);
419
let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();
420
let output = reflect_deserializer.deserialize(&mut deserializer).unwrap();
421
422
let expected = DynamicEnum::from(MyEnum::Struct {
423
value: String::from("I <3 Enums"),
424
});
425
assert!(expected
426
.reflect_partial_eq(output.as_partial_reflect())
427
.unwrap());
428
}
429
430
// Regression test for https://github.com/bevyengine/bevy/issues/12462
431
#[test]
432
fn should_reserialize() {
433
let registry = get_registry();
434
let input1 = get_my_struct();
435
436
let serializer1 = ReflectSerializer::new(&input1, &registry);
437
let serialized1 = ron::ser::to_string(&serializer1).unwrap();
438
439
let mut deserializer = ron::de::Deserializer::from_str(&serialized1).unwrap();
440
let reflect_deserializer = ReflectDeserializer::new(&registry);
441
let input2 = reflect_deserializer.deserialize(&mut deserializer).unwrap();
442
443
let serializer2 = ReflectSerializer::new(input2.as_partial_reflect(), &registry);
444
let serialized2 = ron::ser::to_string(&serializer2).unwrap();
445
446
assert_eq!(serialized1, serialized2);
447
}
448
449
#[test]
450
fn should_deserialize_non_self_describing_binary() {
451
let expected = get_my_struct();
452
let registry = get_registry();
453
454
let input = vec![
455
1, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 98, 101, 118, 121, 95, 114, 101, 102,
456
108, 101, 99, 116, 58, 58, 115, 101, 114, 100, 101, 58, 58, 100, 101, 58, 58, 116, 101,
457
115, 116, 115, 58, 58, 77, 121, 83, 116, 114, 117, 99, 116, 123, 1, 12, 0, 0, 0, 0, 0,
458
0, 0, 72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 33, 1, 123, 0, 0, 0, 0, 0,
459
0, 0, 219, 15, 73, 64, 57, 5, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 254, 255, 255,
460
255, 255, 255, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 254, 255, 255, 255, 255,
461
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,
462
0, 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,
463
0, 0, 0, 0, 0, 84, 117, 112, 108, 101, 32, 83, 116, 114, 117, 99, 116, 0, 0, 0, 0, 1,
464
0, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 164, 112, 157, 63, 164, 112, 77, 64, 3,
465
0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 83, 116, 114, 117, 99, 116, 32, 118, 97, 114, 105,
466
97, 110, 116, 32, 118, 97, 108, 117, 101, 1, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0,
467
0, 0, 101, 0, 0, 0, 0, 0, 0, 0,
468
];
469
470
let deserializer = ReflectDeserializer::new(&registry);
471
472
let config = bincode::config::standard().with_fixed_int_encoding();
473
let (dynamic_output, _read_bytes) =
474
bincode::serde::seed_decode_from_slice(deserializer, &input, config).unwrap();
475
476
let output = <MyStruct as FromReflect>::from_reflect(dynamic_output.as_ref()).unwrap();
477
assert_eq!(expected, output);
478
}
479
480
#[test]
481
fn should_deserialize_self_describing_binary() {
482
let expected = get_my_struct();
483
484
let registry = get_registry();
485
486
let input = vec![
487
129, 217, 40, 98, 101, 118, 121, 95, 114, 101, 102, 108, 101, 99, 116, 58, 58, 115,
488
101, 114, 100, 101, 58, 58, 100, 101, 58, 58, 116, 101, 115, 116, 115, 58, 58, 77, 121,
489
83, 116, 114, 117, 99, 116, 220, 0, 20, 123, 172, 72, 101, 108, 108, 111, 32, 119, 111,
490
114, 108, 100, 33, 145, 123, 146, 202, 64, 73, 15, 219, 205, 5, 57, 149, 254, 255, 0,
491
1, 2, 149, 254, 255, 0, 1, 2, 129, 64, 32, 145, 64, 145, 206, 59, 154, 201, 255, 172,
492
84, 117, 112, 108, 101, 32, 83, 116, 114, 117, 99, 116, 144, 164, 85, 110, 105, 116,
493
129, 167, 78, 101, 119, 84, 121, 112, 101, 123, 129, 165, 84, 117, 112, 108, 101, 146,
494
202, 63, 157, 112, 164, 202, 64, 77, 112, 164, 129, 166, 83, 116, 114, 117, 99, 116,
495
145, 180, 83, 116, 114, 117, 99, 116, 32, 118, 97, 114, 105, 97, 110, 116, 32, 118, 97,
496
108, 117, 101, 144, 144, 129, 166, 83, 116, 114, 117, 99, 116, 144, 129, 165, 84, 117,
497
112, 108, 101, 144, 146, 100, 145, 101,
498
];
499
500
let mut reader = std::io::BufReader::new(input.as_slice());
501
502
let deserializer = ReflectDeserializer::new(&registry);
503
let dynamic_output = deserializer
504
.deserialize(&mut rmp_serde::Deserializer::new(&mut reader))
505
.unwrap();
506
507
let output = <MyStruct as FromReflect>::from_reflect(dynamic_output.as_ref()).unwrap();
508
assert_eq!(expected, output);
509
}
510
511
#[test]
512
fn should_return_error_if_missing_type_data() {
513
let mut registry = TypeRegistry::new();
514
registry.register::<RangeInclusive<f32>>();
515
516
let input = r#"{"core::ops::RangeInclusive<f32>":(start:0.0,end:1.0)}"#;
517
let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();
518
let reflect_deserializer = ReflectDeserializer::new(&registry);
519
let error = reflect_deserializer
520
.deserialize(&mut deserializer)
521
.unwrap_err();
522
#[cfg(feature = "debug_stack")]
523
assert_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()));
524
#[cfg(not(feature = "debug_stack"))]
525
assert_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()));
526
}
527
528
#[test]
529
fn should_use_processor_for_custom_deserialization() {
530
#[derive(Reflect, Debug, PartialEq)]
531
struct Foo {
532
bar: i32,
533
qux: i64,
534
}
535
536
struct FooProcessor;
537
538
impl ReflectDeserializerProcessor for FooProcessor {
539
fn try_deserialize<'de, D>(
540
&mut self,
541
registration: &TypeRegistration,
542
_: &TypeRegistry,
543
deserializer: D,
544
) -> Result<Result<Box<dyn PartialReflect>, D>, D::Error>
545
where
546
D: Deserializer<'de>,
547
{
548
if registration.type_id() == TypeId::of::<i64>() {
549
let _ = deserializer.deserialize_ignored_any(IgnoredAny);
550
Ok(Ok(Box::new(456_i64)))
551
} else {
552
Ok(Err(deserializer))
553
}
554
}
555
}
556
557
let expected = Foo { bar: 123, qux: 456 };
558
559
let input = r#"(
560
bar: 123,
561
qux: 123,
562
)"#;
563
564
let mut registry = get_registry();
565
registry.register::<Foo>();
566
let registration = registry.get(TypeId::of::<Foo>()).unwrap();
567
let mut processor = FooProcessor;
568
let reflect_deserializer =
569
TypedReflectDeserializer::with_processor(registration, &registry, &mut processor);
570
let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();
571
let dynamic_output = reflect_deserializer
572
.deserialize(&mut ron_deserializer)
573
.unwrap();
574
575
let output =
576
<Foo as FromReflect>::from_reflect(dynamic_output.as_partial_reflect()).unwrap();
577
assert_eq!(expected, output);
578
}
579
580
#[test]
581
fn should_use_processor_for_multiple_registrations() {
582
#[derive(Reflect, Debug, PartialEq)]
583
struct Foo {
584
bar: i32,
585
qux: i64,
586
}
587
588
struct FooProcessor;
589
590
impl ReflectDeserializerProcessor for FooProcessor {
591
fn try_deserialize<'de, D>(
592
&mut self,
593
registration: &TypeRegistration,
594
_: &TypeRegistry,
595
deserializer: D,
596
) -> Result<Result<Box<dyn PartialReflect>, D>, D::Error>
597
where
598
D: Deserializer<'de>,
599
{
600
if registration.type_id() == TypeId::of::<i32>() {
601
let _ = deserializer.deserialize_ignored_any(IgnoredAny);
602
Ok(Ok(Box::new(123_i32)))
603
} else if registration.type_id() == TypeId::of::<i64>() {
604
let _ = deserializer.deserialize_ignored_any(IgnoredAny);
605
Ok(Ok(Box::new(456_i64)))
606
} else {
607
Ok(Err(deserializer))
608
}
609
}
610
}
611
612
let expected = Foo { bar: 123, qux: 456 };
613
614
let input = r#"(
615
bar: 0,
616
qux: 0,
617
)"#;
618
619
let mut registry = get_registry();
620
registry.register::<Foo>();
621
let registration = registry.get(TypeId::of::<Foo>()).unwrap();
622
let mut processor = FooProcessor;
623
let reflect_deserializer =
624
TypedReflectDeserializer::with_processor(registration, &registry, &mut processor);
625
let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();
626
let dynamic_output = reflect_deserializer
627
.deserialize(&mut ron_deserializer)
628
.unwrap();
629
630
let output =
631
<Foo as FromReflect>::from_reflect(dynamic_output.as_partial_reflect()).unwrap();
632
assert_eq!(expected, output);
633
}
634
635
#[test]
636
fn should_propagate_processor_deserialize_error() {
637
struct ErroringProcessor;
638
639
impl ReflectDeserializerProcessor for ErroringProcessor {
640
fn try_deserialize<'de, D>(
641
&mut self,
642
registration: &TypeRegistration,
643
_: &TypeRegistry,
644
deserializer: D,
645
) -> Result<Result<Box<dyn PartialReflect>, D>, D::Error>
646
where
647
D: Deserializer<'de>,
648
{
649
if registration.type_id() == TypeId::of::<i32>() {
650
Err(serde::de::Error::custom("my custom deserialize error"))
651
} else {
652
Ok(Err(deserializer))
653
}
654
}
655
}
656
657
let registry = get_registry();
658
659
let input = r#"{"i32":123}"#;
660
let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();
661
let mut processor = ErroringProcessor;
662
let reflect_deserializer = ReflectDeserializer::with_processor(&registry, &mut processor);
663
let error = reflect_deserializer
664
.deserialize(&mut deserializer)
665
.unwrap_err();
666
667
#[cfg(feature = "debug_stack")]
668
assert_eq!(
669
error,
670
ron::Error::Message("my custom deserialize error (stack: `i32`)".to_string())
671
);
672
#[cfg(not(feature = "debug_stack"))]
673
assert_eq!(
674
error,
675
ron::Error::Message("my custom deserialize error".to_string())
676
);
677
}
678
679
#[test]
680
fn should_access_local_scope_in_processor() {
681
struct ValueCountingProcessor<'a> {
682
values_found: &'a mut usize,
683
}
684
685
impl ReflectDeserializerProcessor for ValueCountingProcessor<'_> {
686
fn try_deserialize<'de, D>(
687
&mut self,
688
_: &TypeRegistration,
689
_: &TypeRegistry,
690
deserializer: D,
691
) -> Result<Result<Box<dyn PartialReflect>, D>, D::Error>
692
where
693
D: Deserializer<'de>,
694
{
695
let _ = deserializer.deserialize_ignored_any(IgnoredAny)?;
696
*self.values_found += 1;
697
Ok(Ok(Box::new(123_i32)))
698
}
699
}
700
701
let registry = get_registry();
702
703
let input = r#"{"i32":0}"#;
704
705
let mut values_found = 0_usize;
706
let mut deserializer_processor = ValueCountingProcessor {
707
values_found: &mut values_found,
708
};
709
710
let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();
711
let reflect_deserializer =
712
ReflectDeserializer::with_processor(&registry, &mut deserializer_processor);
713
reflect_deserializer.deserialize(&mut deserializer).unwrap();
714
assert_eq!(1, values_found);
715
}
716
717
#[test]
718
fn should_fail_from_reflect_if_processor_returns_wrong_typed_value() {
719
#[derive(Reflect, Debug, PartialEq)]
720
struct Foo {
721
bar: i32,
722
qux: i64,
723
}
724
725
struct WrongTypeProcessor;
726
727
impl ReflectDeserializerProcessor for WrongTypeProcessor {
728
fn try_deserialize<'de, D>(
729
&mut self,
730
registration: &TypeRegistration,
731
_registry: &TypeRegistry,
732
deserializer: D,
733
) -> Result<Result<Box<dyn PartialReflect>, D>, D::Error>
734
where
735
D: Deserializer<'de>,
736
{
737
if registration.type_id() == TypeId::of::<i32>() {
738
let _ = deserializer.deserialize_ignored_any(IgnoredAny);
739
Ok(Ok(Box::new(42_i64)))
740
} else {
741
Ok(Err(deserializer))
742
}
743
}
744
}
745
746
let input = r#"(
747
bar: 123,
748
qux: 123,
749
)"#;
750
751
let mut registry = get_registry();
752
registry.register::<Foo>();
753
let registration = registry.get(TypeId::of::<Foo>()).unwrap();
754
let mut processor = WrongTypeProcessor;
755
let reflect_deserializer =
756
TypedReflectDeserializer::with_processor(registration, &registry, &mut processor);
757
let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();
758
let dynamic_output = reflect_deserializer
759
.deserialize(&mut ron_deserializer)
760
.unwrap();
761
762
assert!(<Foo as FromReflect>::from_reflect(dynamic_output.as_partial_reflect()).is_none());
763
}
764
765
#[cfg(feature = "functions")]
766
mod functions {
767
use super::*;
768
use crate::func::DynamicFunction;
769
770
#[test]
771
fn should_not_deserialize_function() {
772
#[derive(Reflect)]
773
#[reflect(from_reflect = false)]
774
struct MyStruct {
775
func: DynamicFunction<'static>,
776
}
777
778
let mut registry = TypeRegistry::new();
779
registry.register::<MyStruct>();
780
781
let input = r#"{
782
"bevy_reflect::serde::de::tests::functions::MyStruct": (
783
func: (),
784
),
785
}"#;
786
787
let reflect_deserializer = ReflectDeserializer::new(&registry);
788
let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();
789
790
let error = reflect_deserializer
791
.deserialize(&mut ron_deserializer)
792
.unwrap_err();
793
794
#[cfg(feature = "debug_stack")]
795
assert_eq!(
796
error,
797
ron::Error::Message(
798
"no registration found for type `bevy_reflect::DynamicFunction` (stack: `bevy_reflect::serde::de::tests::functions::MyStruct`)"
799
.to_string()
800
)
801
);
802
803
#[cfg(not(feature = "debug_stack"))]
804
assert_eq!(
805
error,
806
ron::Error::Message(
807
"no registration found for type `bevy_reflect::DynamicFunction`".to_string()
808
)
809
);
810
}
811
}
812
813
#[cfg(feature = "debug_stack")]
814
mod debug_stack {
815
use super::*;
816
817
#[test]
818
fn should_report_context_in_errors() {
819
#[derive(Reflect)]
820
struct Foo {
821
bar: Bar,
822
}
823
824
#[derive(Reflect)]
825
struct Bar {
826
some_other_field: Option<u32>,
827
baz: Baz,
828
}
829
830
#[derive(Reflect)]
831
struct Baz {
832
value: Vec<RangeInclusive<f32>>,
833
}
834
835
let mut registry = TypeRegistry::new();
836
registry.register::<Foo>();
837
registry.register::<Bar>();
838
registry.register::<Baz>();
839
registry.register::<RangeInclusive<f32>>();
840
841
let input = r#"{"bevy_reflect::serde::de::tests::debug_stack::Foo":(bar:(some_other_field:Some(123),baz:(value:[(start:0.0,end:1.0)])))}"#;
842
let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();
843
let reflect_deserializer = ReflectDeserializer::new(&registry);
844
let error = reflect_deserializer
845
.deserialize(&mut deserializer)
846
.unwrap_err();
847
assert_eq!(
848
error,
849
ron::Error::Message(
850
"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()
851
)
852
);
853
}
854
}
855
}
856
857