Skip to content

Commit 3849314

Browse files
committed
Rename UntypedReflectDeserializer -> ReflectDeserializer
1 parent cb9789b commit 3849314

File tree

6 files changed

+174
-58
lines changed

6 files changed

+174
-58
lines changed

crates/bevy_reflect/src/lib.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@
334334
//! The way it works is by moving the serialization logic into common serializers and deserializers:
335335
//! * [`ReflectSerializer`]
336336
//! * [`TypedReflectSerializer`]
337-
//! * [`UntypedReflectDeserializer`]
337+
//! * [`ReflectDeserializer`]
338338
//! * [`TypedReflectDeserializer`]
339339
//!
340340
//! All of these structs require a reference to the [registry] so that [type information] can be retrieved,
@@ -347,7 +347,7 @@
347347
//! and the value is the serialized data.
348348
//! The `TypedReflectSerializer` will simply output the serialized data.
349349
//!
350-
//! The `UntypedReflectDeserializer` can be used to deserialize this map and return a `Box<dyn Reflect>`,
350+
//! The `ReflectDeserializer` can be used to deserialize this map and return a `Box<dyn Reflect>`,
351351
//! where the underlying type will be a dynamic type representing some concrete type (except for value types).
352352
//!
353353
//! Again, it's important to remember that dynamic types may need to be converted to their concrete counterparts
@@ -357,7 +357,7 @@
357357
//! ```
358358
//! # use serde::de::DeserializeSeed;
359359
//! # use bevy_reflect::{
360-
//! # serde::{ReflectSerializer, UntypedReflectDeserializer},
360+
//! # serde::{ReflectSerializer, ReflectDeserializer},
361361
//! # Reflect, FromReflect, TypeRegistry
362362
//! # };
363363
//! #[derive(Reflect, PartialEq, Debug)]
@@ -378,7 +378,7 @@
378378
//! let serialized_value: String = ron::to_string(&reflect_serializer).unwrap();
379379
//!
380380
//! // Deserialize
381-
//! let reflect_deserializer = UntypedReflectDeserializer::new(&registry);
381+
//! let reflect_deserializer = ReflectDeserializer::new(&registry);
382382
//! let deserialized_value: Box<dyn Reflect> = reflect_deserializer.deserialize(
383383
//! &mut ron::Deserializer::from_str(&serialized_value).unwrap()
384384
//! ).unwrap();
@@ -460,7 +460,7 @@
460460
//! [`serde`]: ::serde
461461
//! [`ReflectSerializer`]: serde::ReflectSerializer
462462
//! [`TypedReflectSerializer`]: serde::TypedReflectSerializer
463-
//! [`UntypedReflectDeserializer`]: serde::UntypedReflectDeserializer
463+
//! [`ReflectDeserializer`]: serde::ReflectDeserializer
464464
//! [`TypedReflectDeserializer`]: serde::TypedReflectDeserializer
465465
//! [registry]: TypeRegistry
466466
//! [type information]: TypeInfo
@@ -610,7 +610,7 @@ mod tests {
610610
use super::prelude::*;
611611
use super::*;
612612
use crate as bevy_reflect;
613-
use crate::serde::{ReflectSerializer, UntypedReflectDeserializer};
613+
use crate::serde::{ReflectDeserializer, ReflectSerializer};
614614
use crate::utility::GenericTypePathCell;
615615

616616
#[test]
@@ -1223,7 +1223,7 @@ mod tests {
12231223
let serialized = to_string_pretty(&serializer, PrettyConfig::default()).unwrap();
12241224

12251225
let mut deserializer = Deserializer::from_str(&serialized).unwrap();
1226-
let reflect_deserializer = UntypedReflectDeserializer::new(&registry);
1226+
let reflect_deserializer = ReflectDeserializer::new(&registry);
12271227
let value = reflect_deserializer.deserialize(&mut deserializer).unwrap();
12281228
let dynamic_struct = value.take::<DynamicStruct>().unwrap();
12291229

@@ -2383,7 +2383,7 @@ bevy_reflect::tests::Test {
23832383
registry.register::<Quat>();
23842384
registry.register::<f32>();
23852385

2386-
let de = UntypedReflectDeserializer::new(&registry);
2386+
let de = ReflectDeserializer::new(&registry);
23872387

23882388
let mut deserializer =
23892389
Deserializer::from_str(data).expect("Failed to acquire deserializer");
@@ -2440,7 +2440,7 @@ bevy_reflect::tests::Test {
24402440
registry.add_registration(Vec3::get_type_registration());
24412441
registry.add_registration(f32::get_type_registration());
24422442

2443-
let de = UntypedReflectDeserializer::new(&registry);
2443+
let de = ReflectDeserializer::new(&registry);
24442444

24452445
let mut deserializer =
24462446
Deserializer::from_str(data).expect("Failed to acquire deserializer");

crates/bevy_reflect/src/serde/de.rs

Lines changed: 156 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -242,37 +242,94 @@ impl<'de> Deserialize<'de> for Ident {
242242

243243
/// A general purpose deserializer for reflected types.
244244
///
245-
/// This will return a [`Box<dyn Reflect>`] containing the deserialized data.
246-
/// For non-value types, this `Box` will contain the dynamic equivalent. For example, a
247-
/// deserialized struct will return a [`DynamicStruct`] and a `Vec` will return a
248-
/// [`DynamicList`]. For value types, this `Box` will contain the actual value.
249-
/// For example, an `f32` will contain the actual `f32` type.
245+
/// This is the deserializer counterpart to [`ReflectSerializer`].
250246
///
251-
/// This means that converting to any concrete instance will require the use of
252-
/// [`FromReflect`], or downcasting for value types.
247+
/// See [`TypedReflectDeserializer`] for a deserializer that expects a known type.
253248
///
254-
/// Because the type isn't known ahead of time, the serialized data must take the form of
255-
/// a map containing the following entries (in order):
256-
/// 1. `type`: The _full_ [type path]
257-
/// 2. `value`: The serialized value of the reflected type
249+
/// # Input
258250
///
259-
/// If the type is already known and the [`TypeInfo`] for it can be retrieved,
260-
/// [`TypedReflectDeserializer`] may be used instead to avoid requiring these entries.
251+
/// This deserializer expects a map with a single entry,
252+
/// where the key is the _full_ [type path] of the reflected type
253+
/// and the value is the serialized data.
261254
///
255+
/// # Output
256+
///
257+
/// This deserializer will return a [`Box<dyn Reflect>`] containing the deserialized data.
258+
///
259+
/// For value types (i.e. [`ReflectKind::Value`]) or types that register [`ReflectDeserialize`] type data,
260+
/// this `Box` will contain the expected type.
261+
/// For example, deserializing an `i32` will return a `Box<i32>` (as a `Box<dyn Reflect>`).
262+
///
263+
/// Otherwise, this `Box` will contain the dynamic equivalent.
264+
/// For example, a deserialized struct might return a [`Box<DynamicStruct>`]
265+
/// and a deserialized `Vec` might return a [`Box<DynamicList>`].
266+
///
267+
/// This means that if the actual type is needed, these dynamic representations will need to
268+
/// be converted to the concrete type using [`FromReflect`] or [`ReflectFromReflect`].
269+
///
270+
/// # Example
271+
///
272+
/// ```
273+
/// # use serde::de::DeserializeSeed;
274+
/// # use bevy_reflect::prelude::*;
275+
/// # use bevy_reflect::{DynamicStruct, TypeRegistry, serde::ReflectDeserializer};
276+
/// #[derive(Reflect, PartialEq, Debug)]
277+
/// #[type_path = "my_crate"]
278+
/// struct MyStruct {
279+
/// value: i32
280+
/// }
281+
///
282+
/// let mut registry = TypeRegistry::default();
283+
/// registry.register::<MyStruct>();
284+
///
285+
/// let input = r#"{
286+
/// "my_crate::MyStruct": (
287+
/// value: 123
288+
/// )
289+
/// }"#;
290+
///
291+
/// let mut deserializer = ron::Deserializer::from_str(input).unwrap();
292+
/// let reflect_deserializer = ReflectDeserializer::new(&registry);
293+
///
294+
/// let output: Box<dyn Reflect> = reflect_deserializer.deserialize(&mut deserializer).unwrap();
295+
///
296+
/// // Since `MyStruct` is not a value type and does not register `ReflectDeserialize`,
297+
/// // we know that its deserialized representation will be a `DynamicStruct`.
298+
/// assert!(output.is::<DynamicStruct>());
299+
/// assert!(output.represents::<MyStruct>());
300+
///
301+
/// // We can convert back to `MyStruct` using `FromReflect`.
302+
/// let value: MyStruct = <MyStruct as FromReflect>::from_reflect(&*output).unwrap();
303+
/// assert_eq!(value, MyStruct { value: 123 });
304+
///
305+
/// // We can also do this dynamically with `ReflectFromReflect`.
306+
/// let type_id = output.get_represented_type_info().unwrap().type_id();
307+
/// let reflect_from_reflect = registry.get_type_data::<ReflectFromReflect>(type_id).unwrap();
308+
/// let value: Box<dyn Reflect> = reflect_from_reflect.from_reflect(&*output).unwrap();
309+
/// assert!(value.is::<MyStruct>());
310+
/// assert_eq!(value.take::<MyStruct>().unwrap(), MyStruct { value: 123 });
311+
/// ```
312+
///
313+
/// [`ReflectSerializer`]: crate::serde::ReflectSerializer
314+
/// [type path]: crate::TypePath::type_path
262315
/// [`Box<dyn Reflect>`]: crate::Reflect
316+
/// [`ReflectKind::Value`]: crate::ReflectKind::Value
317+
/// [`ReflectDeserialize`]: crate::ReflectDeserialize
318+
/// [`Box<DynamicStruct>`]: crate::DynamicStruct
319+
/// [`Box<DynamicList>`]: crate::DynamicList
263320
/// [`FromReflect`]: crate::FromReflect
264-
/// [type path]: crate::TypePath::type_path
265-
pub struct UntypedReflectDeserializer<'a> {
321+
/// [`ReflectFromReflect`]: crate::ReflectFromReflect
322+
pub struct ReflectDeserializer<'a> {
266323
registry: &'a TypeRegistry,
267324
}
268325

269-
impl<'a> UntypedReflectDeserializer<'a> {
326+
impl<'a> ReflectDeserializer<'a> {
270327
pub fn new(registry: &'a TypeRegistry) -> Self {
271328
Self { registry }
272329
}
273330
}
274331

275-
impl<'a, 'de> DeserializeSeed<'de> for UntypedReflectDeserializer<'a> {
332+
impl<'a, 'de> DeserializeSeed<'de> for ReflectDeserializer<'a> {
276333
type Value = Box<dyn Reflect>;
277334

278335
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
@@ -365,21 +422,82 @@ impl<'a, 'de> Visitor<'de> for UntypedReflectDeserializerVisitor<'a> {
365422
}
366423
}
367424

368-
/// A deserializer for reflected types whose [`TypeInfo`] is known.
425+
/// A deserializer for reflected types whose [`TypeRegistration`] is known.
369426
///
370-
/// This will return a [`Box<dyn Reflect>`] containing the deserialized data.
371-
/// For non-value types, this `Box` will contain the dynamic equivalent. For example, a
372-
/// deserialized struct will return a [`DynamicStruct`] and a `Vec` will return a
373-
/// [`DynamicList`]. For value types, this `Box` will contain the actual value.
374-
/// For example, an `f32` will contain the actual `f32` type.
427+
/// This is the deserializer counterpart to [`TypedReflectSerializer`].
375428
///
376-
/// This means that converting to any concrete instance will require the use of
377-
/// [`FromReflect`], or downcasting for value types.
429+
/// See [`ReflectDeserializer`] for a deserializer that expects an unknown type.
378430
///
379-
/// If the type is not known ahead of time, use [`UntypedReflectDeserializer`] instead.
431+
/// # Input
432+
///
433+
/// Since the type is already known, the input is just the serialized data.
434+
///
435+
/// # Output
436+
///
437+
/// This deserializer will return a [`Box<dyn Reflect>`] containing the deserialized data.
438+
///
439+
/// For value types (i.e. [`ReflectKind::Value`]) or types that register [`ReflectDeserialize`] type data,
440+
/// this `Box` will contain the expected type.
441+
/// For example, deserializing an `i32` will return a `Box<i32>` (as a `Box<dyn Reflect>`).
442+
///
443+
/// Otherwise, this `Box` will contain the dynamic equivalent.
444+
/// For example, a deserialized struct might return a [`Box<DynamicStruct>`]
445+
/// and a deserialized `Vec` might return a [`Box<DynamicList>`].
446+
///
447+
/// This means that if the actual type is needed, these dynamic representations will need to
448+
/// be converted to the concrete type using [`FromReflect`] or [`ReflectFromReflect`].
449+
///
450+
/// # Example
451+
///
452+
/// ```
453+
/// # use std::any::TypeId;
454+
/// # use serde::de::DeserializeSeed;
455+
/// # use bevy_reflect::prelude::*;
456+
/// # use bevy_reflect::{DynamicStruct, TypeRegistry, serde::TypedReflectDeserializer};
457+
/// #[derive(Reflect, PartialEq, Debug)]
458+
/// struct MyStruct {
459+
/// value: i32
460+
/// }
461+
///
462+
/// let mut registry = TypeRegistry::default();
463+
/// registry.register::<MyStruct>();
464+
///
465+
/// let input = r#"(
466+
/// value: 123
467+
/// )"#;
468+
///
469+
/// let registration = registry.get(TypeId::of::<MyStruct>()).unwrap();
470+
///
471+
/// let mut deserializer = ron::Deserializer::from_str(input).unwrap();
472+
/// let reflect_deserializer = TypedReflectDeserializer::new(registration, &registry);
473+
///
474+
/// let output: Box<dyn Reflect> = reflect_deserializer.deserialize(&mut deserializer).unwrap();
475+
///
476+
/// // Since `MyStruct` is not a value type and does not register `ReflectDeserialize`,
477+
/// // we know that its deserialized representation will be a `DynamicStruct`.
478+
/// assert!(output.is::<DynamicStruct>());
479+
/// assert!(output.represents::<MyStruct>());
480+
///
481+
/// // We can convert back to `MyStruct` using `FromReflect`.
482+
/// let value: MyStruct = <MyStruct as FromReflect>::from_reflect(&*output).unwrap();
483+
/// assert_eq!(value, MyStruct { value: 123 });
484+
///
485+
/// // We can also do this dynamically with `ReflectFromReflect`.
486+
/// let type_id = output.get_represented_type_info().unwrap().type_id();
487+
/// let reflect_from_reflect = registry.get_type_data::<ReflectFromReflect>(type_id).unwrap();
488+
/// let value: Box<dyn Reflect> = reflect_from_reflect.from_reflect(&*output).unwrap();
489+
/// assert!(value.is::<MyStruct>());
490+
/// assert_eq!(value.take::<MyStruct>().unwrap(), MyStruct { value: 123 });
491+
/// ```
380492
///
493+
/// [`TypedReflectSerializer`]: crate::serde::TypedReflectSerializer
381494
/// [`Box<dyn Reflect>`]: crate::Reflect
495+
/// [`ReflectKind::Value`]: crate::ReflectKind::Value
496+
/// [`ReflectDeserialize`]: crate::ReflectDeserialize
497+
/// [`Box<DynamicStruct>`]: crate::DynamicStruct
498+
/// [`Box<DynamicList>`]: crate::DynamicList
382499
/// [`FromReflect`]: crate::FromReflect
500+
/// [`ReflectFromReflect`]: crate::ReflectFromReflect
383501
pub struct TypedReflectDeserializer<'a> {
384502
registration: &'a TypeRegistration,
385503
registry: &'a TypeRegistry,
@@ -1062,7 +1180,7 @@ mod tests {
10621180
use bevy_utils::HashMap;
10631181

10641182
use crate as bevy_reflect;
1065-
use crate::serde::{ReflectSerializer, TypedReflectDeserializer, UntypedReflectDeserializer};
1183+
use crate::serde::{ReflectDeserializer, ReflectSerializer, TypedReflectDeserializer};
10661184
use crate::{DynamicEnum, FromReflect, Reflect, ReflectDeserialize, TypeRegistry};
10671185

10681186
#[derive(Reflect, Debug, PartialEq)]
@@ -1252,7 +1370,7 @@ mod tests {
12521370
),
12531371
}"#;
12541372

1255-
let reflect_deserializer = UntypedReflectDeserializer::new(&registry);
1373+
let reflect_deserializer = ReflectDeserializer::new(&registry);
12561374
let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();
12571375
let dynamic_output = reflect_deserializer
12581376
.deserialize(&mut ron_deserializer)
@@ -1269,7 +1387,7 @@ mod tests {
12691387
}"#;
12701388

12711389
let registry = get_registry();
1272-
let reflect_deserializer = UntypedReflectDeserializer::new(&registry);
1390+
let reflect_deserializer = ReflectDeserializer::new(&registry);
12731391
let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();
12741392
let dynamic_output = reflect_deserializer
12751393
.deserialize(&mut ron_deserializer)
@@ -1336,7 +1454,7 @@ mod tests {
13361454
),
13371455
}"#;
13381456

1339-
let reflect_deserializer = UntypedReflectDeserializer::new(&registry);
1457+
let reflect_deserializer = ReflectDeserializer::new(&registry);
13401458
let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();
13411459
let dynamic_output = reflect_deserializer
13421460
.deserialize(&mut ron_deserializer)
@@ -1358,7 +1476,7 @@ mod tests {
13581476
),
13591477
}"#;
13601478

1361-
let reflect_deserializer = UntypedReflectDeserializer::new(&registry);
1479+
let reflect_deserializer = ReflectDeserializer::new(&registry);
13621480
let mut ron_deserializer = ron::de::Deserializer::from_str(input).unwrap();
13631481
let dynamic_output = reflect_deserializer
13641482
.deserialize(&mut ron_deserializer)
@@ -1388,7 +1506,7 @@ mod tests {
13881506
let input = r#"{
13891507
"bevy_reflect::serde::de::tests::MyEnum": Unit,
13901508
}"#;
1391-
let reflect_deserializer = UntypedReflectDeserializer::new(&registry);
1509+
let reflect_deserializer = ReflectDeserializer::new(&registry);
13921510
let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();
13931511
let output = reflect_deserializer.deserialize(&mut deserializer).unwrap();
13941512

@@ -1399,7 +1517,7 @@ mod tests {
13991517
let input = r#"{
14001518
"bevy_reflect::serde::de::tests::MyEnum": NewType(123),
14011519
}"#;
1402-
let reflect_deserializer = UntypedReflectDeserializer::new(&registry);
1520+
let reflect_deserializer = ReflectDeserializer::new(&registry);
14031521
let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();
14041522
let output = reflect_deserializer.deserialize(&mut deserializer).unwrap();
14051523

@@ -1410,7 +1528,7 @@ mod tests {
14101528
let input = r#"{
14111529
"bevy_reflect::serde::de::tests::MyEnum": Tuple(1.23, 3.21),
14121530
}"#;
1413-
let reflect_deserializer = UntypedReflectDeserializer::new(&registry);
1531+
let reflect_deserializer = ReflectDeserializer::new(&registry);
14141532
let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();
14151533
let output = reflect_deserializer.deserialize(&mut deserializer).unwrap();
14161534

@@ -1423,7 +1541,7 @@ mod tests {
14231541
value: "I <3 Enums",
14241542
),
14251543
}"#;
1426-
let reflect_deserializer = UntypedReflectDeserializer::new(&registry);
1544+
let reflect_deserializer = ReflectDeserializer::new(&registry);
14271545
let mut deserializer = ron::de::Deserializer::from_str(input).unwrap();
14281546
let output = reflect_deserializer.deserialize(&mut deserializer).unwrap();
14291547

@@ -1443,7 +1561,7 @@ mod tests {
14431561
let serialized1 = ron::ser::to_string(&serializer1).unwrap();
14441562

14451563
let mut deserializer = ron::de::Deserializer::from_str(&serialized1).unwrap();
1446-
let reflect_deserializer = UntypedReflectDeserializer::new(&registry);
1564+
let reflect_deserializer = ReflectDeserializer::new(&registry);
14471565
let input2 = reflect_deserializer.deserialize(&mut deserializer).unwrap();
14481566

14491567
let serializer2 = ReflectSerializer::new(&*input2, &registry);
@@ -1473,7 +1591,7 @@ mod tests {
14731591
0,
14741592
];
14751593

1476-
let deserializer = UntypedReflectDeserializer::new(&registry);
1594+
let deserializer = ReflectDeserializer::new(&registry);
14771595

14781596
let dynamic_output = bincode::DefaultOptions::new()
14791597
.with_fixint_encoding()
@@ -1505,7 +1623,7 @@ mod tests {
15051623

15061624
let mut reader = std::io::BufReader::new(input.as_slice());
15071625

1508-
let deserializer = UntypedReflectDeserializer::new(&registry);
1626+
let deserializer = ReflectDeserializer::new(&registry);
15091627
let dynamic_output = deserializer
15101628
.deserialize(&mut rmp_serde::Deserializer::new(&mut reader))
15111629
.unwrap();

0 commit comments

Comments
 (0)