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
9395 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
enums::DynamicEnum,
41
serde::{
42
ReflectDeserializer, ReflectDeserializerProcessor, ReflectSerializer,
43
TypedReflectDeserializer,
44
},
45
FromReflect, PartialReflect, Reflect, ReflectDeserialize, TypeRegistration, 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, 40, 98, 101, 118, 121, 95, 114, 101, 102, 108, 101, 99, 116, 58, 58, 115, 101, 114,
456
100, 101, 58, 58, 100, 101, 58, 58, 116, 101, 115, 116, 115, 58, 58, 77, 121, 83, 116,
457
114, 117, 99, 116, 123, 1, 12, 72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 33,
458
1, 246, 1, 219, 15, 73, 64, 185, 10, 5, 3, 1, 0, 2, 4, 3, 1, 0, 2, 4, 1, 64, 32, 1, 64,
459
254, 167, 214, 185, 7, 12, 84, 117, 112, 108, 101, 32, 83, 116, 114, 117, 99, 116, 0,
460
1, 123, 2, 164, 112, 157, 63, 164, 112, 77, 64, 3, 20, 83, 116, 114, 117, 99, 116, 32,
461
118, 97, 114, 105, 97, 110, 116, 32, 118, 97, 108, 117, 101, 1, 0, 100, 202, 1,
462
];
463
464
let deserializer = ReflectDeserializer::new(&registry);
465
466
let dynamic_output = deserializer
467
.deserialize(&mut postcard::Deserializer::from_bytes(&input))
468
.unwrap();
469
470
let output = <MyStruct as FromReflect>::from_reflect(dynamic_output.as_ref()).unwrap();
471
assert_eq!(expected, output);
472
}
473
474
#[test]
475
fn should_deserialize_self_describing_binary() {
476
let expected = get_my_struct();
477
478
let registry = get_registry();
479
480
let input = vec![
481
129, 217, 40, 98, 101, 118, 121, 95, 114, 101, 102, 108, 101, 99, 116, 58, 58, 115,
482
101, 114, 100, 101, 58, 58, 100, 101, 58, 58, 116, 101, 115, 116, 115, 58, 58, 77, 121,
483
83, 116, 114, 117, 99, 116, 220, 0, 20, 123, 172, 72, 101, 108, 108, 111, 32, 119, 111,
484
114, 108, 100, 33, 145, 123, 146, 202, 64, 73, 15, 219, 205, 5, 57, 149, 254, 255, 0,
485
1, 2, 149, 254, 255, 0, 1, 2, 129, 64, 32, 145, 64, 145, 206, 59, 154, 201, 255, 172,
486
84, 117, 112, 108, 101, 32, 83, 116, 114, 117, 99, 116, 144, 164, 85, 110, 105, 116,
487
129, 167, 78, 101, 119, 84, 121, 112, 101, 123, 129, 165, 84, 117, 112, 108, 101, 146,
488
202, 63, 157, 112, 164, 202, 64, 77, 112, 164, 129, 166, 83, 116, 114, 117, 99, 116,
489
145, 180, 83, 116, 114, 117, 99, 116, 32, 118, 97, 114, 105, 97, 110, 116, 32, 118, 97,
490
108, 117, 101, 144, 144, 129, 166, 83, 116, 114, 117, 99, 116, 144, 129, 165, 84, 117,
491
112, 108, 101, 144, 146, 100, 145, 101,
492
];
493
494
let mut reader = std::io::BufReader::new(input.as_slice());
495
496
let deserializer = ReflectDeserializer::new(&registry);
497
let dynamic_output = deserializer
498
.deserialize(&mut rmp_serde::Deserializer::new(&mut reader))
499
.unwrap();
500
501
let output = <MyStruct as FromReflect>::from_reflect(dynamic_output.as_ref()).unwrap();
502
assert_eq!(expected, output);
503
}
504
505
#[test]
506
fn should_return_error_if_missing_type_data() {
507
let mut registry = TypeRegistry::new();
508
registry.register::<RangeInclusive<f32>>();
509
510
let input = r#"{"core::ops::RangeInclusive<f32>":(start:0.0,end:1.0)}"#;
511
let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();
512
let reflect_deserializer = ReflectDeserializer::new(&registry);
513
let error = reflect_deserializer
514
.deserialize(&mut deserializer)
515
.unwrap_err();
516
#[cfg(feature = "debug_stack")]
517
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()));
518
#[cfg(not(feature = "debug_stack"))]
519
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()));
520
}
521
522
#[test]
523
fn should_use_processor_for_custom_deserialization() {
524
#[derive(Reflect, Debug, PartialEq)]
525
struct Foo {
526
bar: i32,
527
qux: i64,
528
}
529
530
struct FooProcessor;
531
532
impl ReflectDeserializerProcessor for FooProcessor {
533
fn try_deserialize<'de, D>(
534
&mut self,
535
registration: &TypeRegistration,
536
_: &TypeRegistry,
537
deserializer: D,
538
) -> Result<Result<Box<dyn PartialReflect>, D>, D::Error>
539
where
540
D: Deserializer<'de>,
541
{
542
if registration.type_id() == TypeId::of::<i64>() {
543
let _ = deserializer.deserialize_ignored_any(IgnoredAny);
544
Ok(Ok(Box::new(456_i64)))
545
} else {
546
Ok(Err(deserializer))
547
}
548
}
549
}
550
551
let expected = Foo { bar: 123, qux: 456 };
552
553
let input = r#"(
554
bar: 123,
555
qux: 123,
556
)"#;
557
558
let mut registry = get_registry();
559
registry.register::<Foo>();
560
let registration = registry.get(TypeId::of::<Foo>()).unwrap();
561
let mut processor = FooProcessor;
562
let reflect_deserializer =
563
TypedReflectDeserializer::with_processor(registration, &registry, &mut processor);
564
let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();
565
let dynamic_output = reflect_deserializer
566
.deserialize(&mut ron_deserializer)
567
.unwrap();
568
569
let output =
570
<Foo as FromReflect>::from_reflect(dynamic_output.as_partial_reflect()).unwrap();
571
assert_eq!(expected, output);
572
}
573
574
#[test]
575
fn should_use_processor_for_multiple_registrations() {
576
#[derive(Reflect, Debug, PartialEq)]
577
struct Foo {
578
bar: i32,
579
qux: i64,
580
}
581
582
struct FooProcessor;
583
584
impl ReflectDeserializerProcessor for FooProcessor {
585
fn try_deserialize<'de, D>(
586
&mut self,
587
registration: &TypeRegistration,
588
_: &TypeRegistry,
589
deserializer: D,
590
) -> Result<Result<Box<dyn PartialReflect>, D>, D::Error>
591
where
592
D: Deserializer<'de>,
593
{
594
if registration.type_id() == TypeId::of::<i32>() {
595
let _ = deserializer.deserialize_ignored_any(IgnoredAny);
596
Ok(Ok(Box::new(123_i32)))
597
} else if registration.type_id() == TypeId::of::<i64>() {
598
let _ = deserializer.deserialize_ignored_any(IgnoredAny);
599
Ok(Ok(Box::new(456_i64)))
600
} else {
601
Ok(Err(deserializer))
602
}
603
}
604
}
605
606
let expected = Foo { bar: 123, qux: 456 };
607
608
let input = r#"(
609
bar: 0,
610
qux: 0,
611
)"#;
612
613
let mut registry = get_registry();
614
registry.register::<Foo>();
615
let registration = registry.get(TypeId::of::<Foo>()).unwrap();
616
let mut processor = FooProcessor;
617
let reflect_deserializer =
618
TypedReflectDeserializer::with_processor(registration, &registry, &mut processor);
619
let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();
620
let dynamic_output = reflect_deserializer
621
.deserialize(&mut ron_deserializer)
622
.unwrap();
623
624
let output =
625
<Foo as FromReflect>::from_reflect(dynamic_output.as_partial_reflect()).unwrap();
626
assert_eq!(expected, output);
627
}
628
629
#[test]
630
fn should_propagate_processor_deserialize_error() {
631
struct ErroringProcessor;
632
633
impl ReflectDeserializerProcessor for ErroringProcessor {
634
fn try_deserialize<'de, D>(
635
&mut self,
636
registration: &TypeRegistration,
637
_: &TypeRegistry,
638
deserializer: D,
639
) -> Result<Result<Box<dyn PartialReflect>, D>, D::Error>
640
where
641
D: Deserializer<'de>,
642
{
643
if registration.type_id() == TypeId::of::<i32>() {
644
Err(serde::de::Error::custom("my custom deserialize error"))
645
} else {
646
Ok(Err(deserializer))
647
}
648
}
649
}
650
651
let registry = get_registry();
652
653
let input = r#"{"i32":123}"#;
654
let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();
655
let mut processor = ErroringProcessor;
656
let reflect_deserializer = ReflectDeserializer::with_processor(&registry, &mut processor);
657
let error = reflect_deserializer
658
.deserialize(&mut deserializer)
659
.unwrap_err();
660
661
#[cfg(feature = "debug_stack")]
662
assert_eq!(
663
error,
664
ron::Error::Message("my custom deserialize error (stack: `i32`)".to_string())
665
);
666
#[cfg(not(feature = "debug_stack"))]
667
assert_eq!(
668
error,
669
ron::Error::Message("my custom deserialize error".to_string())
670
);
671
}
672
673
#[test]
674
fn should_access_local_scope_in_processor() {
675
struct ValueCountingProcessor<'a> {
676
values_found: &'a mut usize,
677
}
678
679
impl ReflectDeserializerProcessor for ValueCountingProcessor<'_> {
680
fn try_deserialize<'de, D>(
681
&mut self,
682
_: &TypeRegistration,
683
_: &TypeRegistry,
684
deserializer: D,
685
) -> Result<Result<Box<dyn PartialReflect>, D>, D::Error>
686
where
687
D: Deserializer<'de>,
688
{
689
let _ = deserializer.deserialize_ignored_any(IgnoredAny)?;
690
*self.values_found += 1;
691
Ok(Ok(Box::new(123_i32)))
692
}
693
}
694
695
let registry = get_registry();
696
697
let input = r#"{"i32":0}"#;
698
699
let mut values_found = 0_usize;
700
let mut deserializer_processor = ValueCountingProcessor {
701
values_found: &mut values_found,
702
};
703
704
let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();
705
let reflect_deserializer =
706
ReflectDeserializer::with_processor(&registry, &mut deserializer_processor);
707
reflect_deserializer.deserialize(&mut deserializer).unwrap();
708
assert_eq!(1, values_found);
709
}
710
711
#[test]
712
fn should_fail_from_reflect_if_processor_returns_wrong_typed_value() {
713
#[derive(Reflect, Debug, PartialEq)]
714
struct Foo {
715
bar: i32,
716
qux: i64,
717
}
718
719
struct WrongTypeProcessor;
720
721
impl ReflectDeserializerProcessor for WrongTypeProcessor {
722
fn try_deserialize<'de, D>(
723
&mut self,
724
registration: &TypeRegistration,
725
_registry: &TypeRegistry,
726
deserializer: D,
727
) -> Result<Result<Box<dyn PartialReflect>, D>, D::Error>
728
where
729
D: Deserializer<'de>,
730
{
731
if registration.type_id() == TypeId::of::<i32>() {
732
let _ = deserializer.deserialize_ignored_any(IgnoredAny);
733
Ok(Ok(Box::new(42_i64)))
734
} else {
735
Ok(Err(deserializer))
736
}
737
}
738
}
739
740
let input = r#"(
741
bar: 123,
742
qux: 123,
743
)"#;
744
745
let mut registry = get_registry();
746
registry.register::<Foo>();
747
let registration = registry.get(TypeId::of::<Foo>()).unwrap();
748
let mut processor = WrongTypeProcessor;
749
let reflect_deserializer =
750
TypedReflectDeserializer::with_processor(registration, &registry, &mut processor);
751
let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();
752
let dynamic_output = reflect_deserializer
753
.deserialize(&mut ron_deserializer)
754
.unwrap();
755
756
assert!(<Foo as FromReflect>::from_reflect(dynamic_output.as_partial_reflect()).is_none());
757
}
758
759
#[cfg(feature = "functions")]
760
mod functions {
761
use super::*;
762
use crate::func::DynamicFunction;
763
764
#[test]
765
fn should_not_deserialize_function() {
766
#[derive(Reflect)]
767
#[reflect(from_reflect = false)]
768
struct MyStruct {
769
func: DynamicFunction<'static>,
770
}
771
772
let mut registry = TypeRegistry::new();
773
registry.register::<MyStruct>();
774
775
let input = r#"{
776
"bevy_reflect::serde::de::tests::functions::MyStruct": (
777
func: (),
778
),
779
}"#;
780
781
let reflect_deserializer = ReflectDeserializer::new(&registry);
782
let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();
783
784
let error = reflect_deserializer
785
.deserialize(&mut ron_deserializer)
786
.unwrap_err();
787
788
#[cfg(feature = "debug_stack")]
789
assert_eq!(
790
error,
791
ron::Error::Message(
792
"no registration found for type `bevy_reflect::DynamicFunction` (stack: `bevy_reflect::serde::de::tests::functions::MyStruct`)"
793
.to_string()
794
)
795
);
796
797
#[cfg(not(feature = "debug_stack"))]
798
assert_eq!(
799
error,
800
ron::Error::Message(
801
"no registration found for type `bevy_reflect::DynamicFunction`".to_string()
802
)
803
);
804
}
805
}
806
807
#[cfg(feature = "debug_stack")]
808
mod debug_stack {
809
use super::*;
810
811
#[test]
812
fn should_report_context_in_errors() {
813
#[derive(Reflect)]
814
struct Foo {
815
bar: Bar,
816
}
817
818
#[derive(Reflect)]
819
struct Bar {
820
some_other_field: Option<u32>,
821
baz: Baz,
822
}
823
824
#[derive(Reflect)]
825
struct Baz {
826
value: Vec<RangeInclusive<f32>>,
827
}
828
829
let mut registry = TypeRegistry::new();
830
registry.register::<Foo>();
831
registry.register::<Bar>();
832
registry.register::<Baz>();
833
registry.register::<RangeInclusive<f32>>();
834
835
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)])))}"#;
836
let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();
837
let reflect_deserializer = ReflectDeserializer::new(&registry);
838
let error = reflect_deserializer
839
.deserialize(&mut deserializer)
840
.unwrap_err();
841
assert_eq!(
842
error,
843
ron::Error::Message(
844
"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()
845
)
846
);
847
}
848
}
849
}
850
851