Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_reflect/src/serde/de/deserializer.rs
6600 views
1
#[cfg(feature = "debug_stack")]
2
use crate::serde::de::error_utils::TYPE_INFO_STACK;
3
use crate::serde::{ReflectDeserializeWithRegistry, SerializationData};
4
use crate::{
5
serde::{
6
de::{
7
arrays::ArrayVisitor, enums::EnumVisitor, error_utils::make_custom_error,
8
lists::ListVisitor, maps::MapVisitor, options::OptionVisitor, sets::SetVisitor,
9
structs::StructVisitor, tuple_structs::TupleStructVisitor, tuples::TupleVisitor,
10
},
11
TypeRegistrationDeserializer,
12
},
13
PartialReflect, ReflectDeserialize, TypeInfo, TypePath, TypeRegistration, TypeRegistry,
14
};
15
use alloc::boxed::Box;
16
use core::{fmt, fmt::Formatter};
17
use serde::de::{DeserializeSeed, Error, IgnoredAny, MapAccess, Visitor};
18
19
use super::ReflectDeserializerProcessor;
20
21
/// A general purpose deserializer for reflected types.
22
///
23
/// This is the deserializer counterpart to [`ReflectSerializer`].
24
///
25
/// See [`TypedReflectDeserializer`] for a deserializer that expects a known type.
26
///
27
/// # Input
28
///
29
/// This deserializer expects a map with a single entry,
30
/// where the key is the _full_ [type path] of the reflected type
31
/// and the value is the serialized data.
32
///
33
/// # Output
34
///
35
/// This deserializer will return a [`Box<dyn Reflect>`] containing the deserialized data.
36
///
37
/// For opaque types (i.e. [`ReflectKind::Opaque`]) or types that register [`ReflectDeserialize`] type data,
38
/// this `Box` will contain the expected type.
39
/// For example, deserializing an `i32` will return a `Box<i32>` (as a `Box<dyn Reflect>`).
40
///
41
/// Otherwise, this `Box` will contain the dynamic equivalent.
42
/// For example, a deserialized struct might return a [`Box<DynamicStruct>`]
43
/// and a deserialized `Vec` might return a [`Box<DynamicList>`].
44
///
45
/// This means that if the actual type is needed, these dynamic representations will need to
46
/// be converted to the concrete type using [`FromReflect`] or [`ReflectFromReflect`].
47
///
48
/// If you want to override deserialization for a specific [`TypeRegistration`],
49
/// you can pass in a reference to a [`ReflectDeserializerProcessor`] which will
50
/// take priority over all other deserialization methods - see [`with_processor`].
51
///
52
/// # Example
53
///
54
/// ```
55
/// # use serde::de::DeserializeSeed;
56
/// # use bevy_reflect::prelude::*;
57
/// # use bevy_reflect::{DynamicStruct, TypeRegistry, serde::ReflectDeserializer};
58
/// #[derive(Reflect, PartialEq, Debug)]
59
/// #[type_path = "my_crate"]
60
/// struct MyStruct {
61
/// value: i32
62
/// }
63
///
64
/// let mut registry = TypeRegistry::default();
65
/// registry.register::<MyStruct>();
66
///
67
/// let input = r#"{
68
/// "my_crate::MyStruct": (
69
/// value: 123
70
/// )
71
/// }"#;
72
///
73
/// let mut deserializer = ron::Deserializer::from_str(input).unwrap();
74
/// let reflect_deserializer = ReflectDeserializer::new(&registry);
75
///
76
/// let output: Box<dyn PartialReflect> = reflect_deserializer.deserialize(&mut deserializer).unwrap();
77
///
78
/// // Since `MyStruct` is not an opaque type and does not register `ReflectDeserialize`,
79
/// // we know that its deserialized value will be a `DynamicStruct`,
80
/// // although it will represent `MyStruct`.
81
/// assert!(output.as_partial_reflect().represents::<MyStruct>());
82
///
83
/// // We can convert back to `MyStruct` using `FromReflect`.
84
/// let value: MyStruct = <MyStruct as FromReflect>::from_reflect(output.as_partial_reflect()).unwrap();
85
/// assert_eq!(value, MyStruct { value: 123 });
86
///
87
/// // We can also do this dynamically with `ReflectFromReflect`.
88
/// let type_id = output.get_represented_type_info().unwrap().type_id();
89
/// let reflect_from_reflect = registry.get_type_data::<ReflectFromReflect>(type_id).unwrap();
90
/// let value: Box<dyn Reflect> = reflect_from_reflect.from_reflect(output.as_partial_reflect()).unwrap();
91
/// assert!(value.is::<MyStruct>());
92
/// assert_eq!(value.take::<MyStruct>().unwrap(), MyStruct { value: 123 });
93
/// ```
94
///
95
/// [`ReflectSerializer`]: crate::serde::ReflectSerializer
96
/// [type path]: crate::TypePath::type_path
97
/// [`Box<dyn Reflect>`]: crate::Reflect
98
/// [`ReflectKind::Opaque`]: crate::ReflectKind::Opaque
99
/// [`ReflectDeserialize`]: crate::ReflectDeserialize
100
/// [`Box<DynamicStruct>`]: crate::DynamicStruct
101
/// [`Box<DynamicList>`]: crate::DynamicList
102
/// [`FromReflect`]: crate::FromReflect
103
/// [`ReflectFromReflect`]: crate::ReflectFromReflect
104
/// [`with_processor`]: Self::with_processor
105
pub struct ReflectDeserializer<'a, P: ReflectDeserializerProcessor = ()> {
106
registry: &'a TypeRegistry,
107
processor: Option<&'a mut P>,
108
}
109
110
impl<'a> ReflectDeserializer<'a, ()> {
111
/// Creates a deserializer with no processor.
112
///
113
/// If you want to add custom logic for deserializing certain types, use
114
/// [`with_processor`].
115
///
116
/// [`with_processor`]: Self::with_processor
117
pub fn new(registry: &'a TypeRegistry) -> Self {
118
Self {
119
registry,
120
processor: None,
121
}
122
}
123
}
124
125
impl<'a, P: ReflectDeserializerProcessor> ReflectDeserializer<'a, P> {
126
/// Creates a deserializer with a processor.
127
///
128
/// If you do not need any custom logic for handling certain types, use
129
/// [`new`].
130
///
131
/// [`new`]: Self::new
132
pub fn with_processor(registry: &'a TypeRegistry, processor: &'a mut P) -> Self {
133
Self {
134
registry,
135
processor: Some(processor),
136
}
137
}
138
}
139
140
impl<'de, P: ReflectDeserializerProcessor> DeserializeSeed<'de> for ReflectDeserializer<'_, P> {
141
type Value = Box<dyn PartialReflect>;
142
143
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
144
where
145
D: serde::Deserializer<'de>,
146
{
147
struct UntypedReflectDeserializerVisitor<'a, P> {
148
registry: &'a TypeRegistry,
149
processor: Option<&'a mut P>,
150
}
151
152
impl<'de, P: ReflectDeserializerProcessor> Visitor<'de>
153
for UntypedReflectDeserializerVisitor<'_, P>
154
{
155
type Value = Box<dyn PartialReflect>;
156
157
fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
158
formatter
159
.write_str("map containing `type` and `value` entries for the reflected value")
160
}
161
162
fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
163
where
164
A: MapAccess<'de>,
165
{
166
let registration = map
167
.next_key_seed(TypeRegistrationDeserializer::new(self.registry))?
168
.ok_or_else(|| Error::invalid_length(0, &"a single entry"))?;
169
170
let value = map.next_value_seed(TypedReflectDeserializer::new_internal(
171
registration,
172
self.registry,
173
self.processor,
174
))?;
175
176
if map.next_key::<IgnoredAny>()?.is_some() {
177
return Err(Error::invalid_length(2, &"a single entry"));
178
}
179
180
Ok(value)
181
}
182
}
183
184
deserializer.deserialize_map(UntypedReflectDeserializerVisitor {
185
registry: self.registry,
186
processor: self.processor,
187
})
188
}
189
}
190
191
/// A deserializer for reflected types whose [`TypeRegistration`] is known.
192
///
193
/// This is the deserializer counterpart to [`TypedReflectSerializer`].
194
///
195
/// See [`ReflectDeserializer`] for a deserializer that expects an unknown type.
196
///
197
/// # Input
198
///
199
/// Since the type is already known, the input is just the serialized data.
200
///
201
/// # Output
202
///
203
/// This deserializer will return a [`Box<dyn Reflect>`] containing the deserialized data.
204
///
205
/// For opaque types (i.e. [`ReflectKind::Opaque`]) or types that register [`ReflectDeserialize`] type data,
206
/// this `Box` will contain the expected type.
207
/// For example, deserializing an `i32` will return a `Box<i32>` (as a `Box<dyn Reflect>`).
208
///
209
/// Otherwise, this `Box` will contain the dynamic equivalent.
210
/// For example, a deserialized struct might return a [`Box<DynamicStruct>`]
211
/// and a deserialized `Vec` might return a [`Box<DynamicList>`].
212
///
213
/// This means that if the actual type is needed, these dynamic representations will need to
214
/// be converted to the concrete type using [`FromReflect`] or [`ReflectFromReflect`].
215
///
216
/// If you want to override deserialization for a specific [`TypeRegistration`],
217
/// you can pass in a reference to a [`ReflectDeserializerProcessor`] which will
218
/// take priority over all other deserialization methods - see [`with_processor`].
219
///
220
/// # Example
221
///
222
/// ```
223
/// # use core::any::TypeId;
224
/// # use serde::de::DeserializeSeed;
225
/// # use bevy_reflect::prelude::*;
226
/// # use bevy_reflect::{DynamicStruct, TypeRegistry, serde::TypedReflectDeserializer};
227
/// #[derive(Reflect, PartialEq, Debug)]
228
/// struct MyStruct {
229
/// value: i32
230
/// }
231
///
232
/// let mut registry = TypeRegistry::default();
233
/// registry.register::<MyStruct>();
234
///
235
/// let input = r#"(
236
/// value: 123
237
/// )"#;
238
///
239
/// let registration = registry.get(TypeId::of::<MyStruct>()).unwrap();
240
///
241
/// let mut deserializer = ron::Deserializer::from_str(input).unwrap();
242
/// let reflect_deserializer = TypedReflectDeserializer::new(registration, &registry);
243
///
244
/// let output: Box<dyn PartialReflect> = reflect_deserializer.deserialize(&mut deserializer).unwrap();
245
///
246
/// // Since `MyStruct` is not an opaque type and does not register `ReflectDeserialize`,
247
/// // we know that its deserialized value will be a `DynamicStruct`,
248
/// // although it will represent `MyStruct`.
249
/// assert!(output.as_partial_reflect().represents::<MyStruct>());
250
///
251
/// // We can convert back to `MyStruct` using `FromReflect`.
252
/// let value: MyStruct = <MyStruct as FromReflect>::from_reflect(output.as_partial_reflect()).unwrap();
253
/// assert_eq!(value, MyStruct { value: 123 });
254
///
255
/// // We can also do this dynamically with `ReflectFromReflect`.
256
/// let type_id = output.get_represented_type_info().unwrap().type_id();
257
/// let reflect_from_reflect = registry.get_type_data::<ReflectFromReflect>(type_id).unwrap();
258
/// let value: Box<dyn Reflect> = reflect_from_reflect.from_reflect(output.as_partial_reflect()).unwrap();
259
/// assert!(value.is::<MyStruct>());
260
/// assert_eq!(value.take::<MyStruct>().unwrap(), MyStruct { value: 123 });
261
/// ```
262
///
263
/// [`TypedReflectSerializer`]: crate::serde::TypedReflectSerializer
264
/// [`Box<dyn Reflect>`]: crate::Reflect
265
/// [`ReflectKind::Opaque`]: crate::ReflectKind::Opaque
266
/// [`ReflectDeserialize`]: crate::ReflectDeserialize
267
/// [`Box<DynamicStruct>`]: crate::DynamicStruct
268
/// [`Box<DynamicList>`]: crate::DynamicList
269
/// [`FromReflect`]: crate::FromReflect
270
/// [`ReflectFromReflect`]: crate::ReflectFromReflect
271
/// [`with_processor`]: Self::with_processor
272
pub struct TypedReflectDeserializer<'a, P: ReflectDeserializerProcessor = ()> {
273
registration: &'a TypeRegistration,
274
registry: &'a TypeRegistry,
275
processor: Option<&'a mut P>,
276
}
277
278
impl<'a> TypedReflectDeserializer<'a, ()> {
279
/// Creates a typed deserializer with no processor.
280
///
281
/// If you want to add custom logic for deserializing certain types, use
282
/// [`with_processor`].
283
///
284
/// [`with_processor`]: Self::with_processor
285
pub fn new(registration: &'a TypeRegistration, registry: &'a TypeRegistry) -> Self {
286
#[cfg(feature = "debug_stack")]
287
TYPE_INFO_STACK.set(crate::type_info_stack::TypeInfoStack::new());
288
289
Self {
290
registration,
291
registry,
292
processor: None,
293
}
294
}
295
296
/// Creates a new [`TypedReflectDeserializer`] for the given type `T`
297
/// without a processor.
298
///
299
/// # Panics
300
///
301
/// Panics if `T` is not registered in the given [`TypeRegistry`].
302
pub fn of<T: TypePath>(registry: &'a TypeRegistry) -> Self {
303
let registration = registry
304
.get(core::any::TypeId::of::<T>())
305
.unwrap_or_else(|| panic!("no registration found for type `{}`", T::type_path()));
306
307
Self {
308
registration,
309
registry,
310
processor: None,
311
}
312
}
313
}
314
315
impl<'a, P: ReflectDeserializerProcessor> TypedReflectDeserializer<'a, P> {
316
/// Creates a typed deserializer with a processor.
317
///
318
/// If you do not need any custom logic for handling certain types, use
319
/// [`new`].
320
///
321
/// [`new`]: Self::new
322
pub fn with_processor(
323
registration: &'a TypeRegistration,
324
registry: &'a TypeRegistry,
325
processor: &'a mut P,
326
) -> Self {
327
#[cfg(feature = "debug_stack")]
328
TYPE_INFO_STACK.set(crate::type_info_stack::TypeInfoStack::new());
329
330
Self {
331
registration,
332
registry,
333
processor: Some(processor),
334
}
335
}
336
337
/// An internal constructor for creating a deserializer without resetting the type info stack.
338
pub(super) fn new_internal(
339
registration: &'a TypeRegistration,
340
registry: &'a TypeRegistry,
341
processor: Option<&'a mut P>,
342
) -> Self {
343
Self {
344
registration,
345
registry,
346
processor,
347
}
348
}
349
}
350
351
impl<'de, P: ReflectDeserializerProcessor> DeserializeSeed<'de>
352
for TypedReflectDeserializer<'_, P>
353
{
354
type Value = Box<dyn PartialReflect>;
355
356
fn deserialize<D>(mut self, deserializer: D) -> Result<Self::Value, D::Error>
357
where
358
D: serde::Deserializer<'de>,
359
{
360
let deserialize_internal = || -> Result<Self::Value, D::Error> {
361
// First, check if our processor wants to deserialize this type
362
// This takes priority over any other deserialization operations
363
let deserializer = if let Some(processor) = self.processor.as_deref_mut() {
364
match processor.try_deserialize(self.registration, self.registry, deserializer) {
365
Ok(Ok(value)) => {
366
return Ok(value);
367
}
368
Err(err) => {
369
return Err(make_custom_error(err));
370
}
371
Ok(Err(deserializer)) => deserializer,
372
}
373
} else {
374
deserializer
375
};
376
377
let type_path = self.registration.type_info().type_path();
378
379
// Handle both Value case and types that have a custom `ReflectDeserialize`
380
if let Some(deserialize_reflect) = self.registration.data::<ReflectDeserialize>() {
381
let value = deserialize_reflect.deserialize(deserializer)?;
382
return Ok(value.into_partial_reflect());
383
}
384
385
if let Some(deserialize_reflect) =
386
self.registration.data::<ReflectDeserializeWithRegistry>()
387
{
388
let value = deserialize_reflect.deserialize(deserializer, self.registry)?;
389
return Ok(value);
390
}
391
392
match self.registration.type_info() {
393
TypeInfo::Struct(struct_info) => {
394
let mut dynamic_struct = deserializer.deserialize_struct(
395
struct_info.type_path_table().ident().unwrap(),
396
struct_info.field_names(),
397
StructVisitor {
398
struct_info,
399
registration: self.registration,
400
registry: self.registry,
401
processor: self.processor,
402
},
403
)?;
404
dynamic_struct.set_represented_type(Some(self.registration.type_info()));
405
Ok(Box::new(dynamic_struct))
406
}
407
TypeInfo::TupleStruct(tuple_struct_info) => {
408
let mut dynamic_tuple_struct = if tuple_struct_info.field_len() == 1
409
&& self.registration.data::<SerializationData>().is_none()
410
{
411
deserializer.deserialize_newtype_struct(
412
tuple_struct_info.type_path_table().ident().unwrap(),
413
TupleStructVisitor {
414
tuple_struct_info,
415
registration: self.registration,
416
registry: self.registry,
417
processor: self.processor,
418
},
419
)?
420
} else {
421
deserializer.deserialize_tuple_struct(
422
tuple_struct_info.type_path_table().ident().unwrap(),
423
tuple_struct_info.field_len(),
424
TupleStructVisitor {
425
tuple_struct_info,
426
registration: self.registration,
427
registry: self.registry,
428
processor: self.processor,
429
},
430
)?
431
};
432
dynamic_tuple_struct.set_represented_type(Some(self.registration.type_info()));
433
Ok(Box::new(dynamic_tuple_struct))
434
}
435
TypeInfo::List(list_info) => {
436
let mut dynamic_list = deserializer.deserialize_seq(ListVisitor {
437
list_info,
438
registry: self.registry,
439
processor: self.processor,
440
})?;
441
dynamic_list.set_represented_type(Some(self.registration.type_info()));
442
Ok(Box::new(dynamic_list))
443
}
444
TypeInfo::Array(array_info) => {
445
let mut dynamic_array = deserializer.deserialize_tuple(
446
array_info.capacity(),
447
ArrayVisitor {
448
array_info,
449
registry: self.registry,
450
processor: self.processor,
451
},
452
)?;
453
dynamic_array.set_represented_type(Some(self.registration.type_info()));
454
Ok(Box::new(dynamic_array))
455
}
456
TypeInfo::Map(map_info) => {
457
let mut dynamic_map = deserializer.deserialize_map(MapVisitor {
458
map_info,
459
registry: self.registry,
460
processor: self.processor,
461
})?;
462
dynamic_map.set_represented_type(Some(self.registration.type_info()));
463
Ok(Box::new(dynamic_map))
464
}
465
TypeInfo::Set(set_info) => {
466
let mut dynamic_set = deserializer.deserialize_seq(SetVisitor {
467
set_info,
468
registry: self.registry,
469
processor: self.processor,
470
})?;
471
dynamic_set.set_represented_type(Some(self.registration.type_info()));
472
Ok(Box::new(dynamic_set))
473
}
474
TypeInfo::Tuple(tuple_info) => {
475
let mut dynamic_tuple = deserializer.deserialize_tuple(
476
tuple_info.field_len(),
477
TupleVisitor {
478
tuple_info,
479
registration: self.registration,
480
registry: self.registry,
481
processor: self.processor,
482
},
483
)?;
484
dynamic_tuple.set_represented_type(Some(self.registration.type_info()));
485
Ok(Box::new(dynamic_tuple))
486
}
487
TypeInfo::Enum(enum_info) => {
488
let mut dynamic_enum = if enum_info.type_path_table().module_path()
489
== Some("core::option")
490
&& enum_info.type_path_table().ident() == Some("Option")
491
{
492
deserializer.deserialize_option(OptionVisitor {
493
enum_info,
494
registry: self.registry,
495
processor: self.processor,
496
})?
497
} else {
498
deserializer.deserialize_enum(
499
enum_info.type_path_table().ident().unwrap(),
500
enum_info.variant_names(),
501
EnumVisitor {
502
enum_info,
503
registration: self.registration,
504
registry: self.registry,
505
processor: self.processor,
506
},
507
)?
508
};
509
dynamic_enum.set_represented_type(Some(self.registration.type_info()));
510
Ok(Box::new(dynamic_enum))
511
}
512
TypeInfo::Opaque(_) => {
513
// This case should already be handled
514
Err(make_custom_error(format_args!(
515
"type `{type_path}` did not register the `ReflectDeserialize` type data. For certain types, this may need to be registered manually using `register_type_data`",
516
)))
517
}
518
}
519
};
520
521
#[cfg(feature = "debug_stack")]
522
TYPE_INFO_STACK.with_borrow_mut(|stack| stack.push(self.registration.type_info()));
523
524
let output = deserialize_internal();
525
526
#[cfg(feature = "debug_stack")]
527
TYPE_INFO_STACK.with_borrow_mut(crate::type_info_stack::TypeInfoStack::pop);
528
529
output
530
}
531
}
532
533