Skip to content

Commit 17c4b07

Browse files
authored
bevy_reflect: Add ReflectSerializerProcessor (#15548)
**NOTE: This is based on, and should be merged alongside, #15482 I'll leave this in draft until that PR is merged. # Objective Equivalent of #15482 but for serialization. See that issue for the motivation. Also part of this tracking issue: #15518 This PR is non-breaking, just like the deserializer PR (because the new type parameter `P` has a default `P = ()`). ## Solution Identical solution to the deserializer PR. ## Testing Added unit tests and a very comprehensive doc test outlining a clear example and use case.
1 parent ded5ce2 commit 17c4b07

File tree

12 files changed

+625
-135
lines changed

12 files changed

+625
-135
lines changed

crates/bevy_reflect/src/serde/de/processor.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ use crate::{PartialReflect, TypeRegistration, TypeRegistry};
1515
/// deserializer and give back a [`Box<dyn PartialReflect>`], or return
1616
/// ownership of the deserializer back, and continue with the default logic.
1717
///
18+
/// The serialization equivalent of this is [`ReflectSerializerProcessor`].
19+
///
1820
/// # Compared to [`DeserializeWithRegistry`]
1921
///
2022
/// [`DeserializeWithRegistry`] allows you to define how your type will be
@@ -134,6 +136,7 @@ use crate::{PartialReflect, TypeRegistration, TypeRegistry};
134136
/// [`TypedReflectDeserializer`]: crate::serde::TypedReflectDeserializer
135137
/// [`try_deserialize`]: Self::try_deserialize
136138
/// [`DeserializeWithRegistry`]: crate::serde::DeserializeWithRegistry
139+
/// [`ReflectSerializerProcessor`]: crate::serde::ReflectSerializerProcessor
137140
pub trait ReflectDeserializerProcessor {
138141
/// Attempts to deserialize the value which a [`TypedReflectDeserializer`]
139142
/// is currently looking at, and knows the type of.

crates/bevy_reflect/src/serde/ser/arrays.rs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,27 @@
11
use crate::{serde::TypedReflectSerializer, Array, TypeRegistry};
22
use serde::{ser::SerializeTuple, Serialize};
33

4-
/// A serializer for [`Array`] values.
5-
pub(super) struct ArraySerializer<'a> {
6-
array: &'a dyn Array,
7-
registry: &'a TypeRegistry,
8-
}
4+
use super::ReflectSerializerProcessor;
95

10-
impl<'a> ArraySerializer<'a> {
11-
pub fn new(array: &'a dyn Array, registry: &'a TypeRegistry) -> Self {
12-
Self { array, registry }
13-
}
6+
/// A serializer for [`Array`] values.
7+
pub(super) struct ArraySerializer<'a, P> {
8+
pub array: &'a dyn Array,
9+
pub registry: &'a TypeRegistry,
10+
pub processor: Option<&'a P>,
1411
}
1512

16-
impl<'a> Serialize for ArraySerializer<'a> {
13+
impl<P: ReflectSerializerProcessor> Serialize for ArraySerializer<'_, P> {
1714
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1815
where
1916
S: serde::Serializer,
2017
{
2118
let mut state = serializer.serialize_tuple(self.array.len())?;
2219
for value in self.array.iter() {
23-
state.serialize_element(&TypedReflectSerializer::new_internal(value, self.registry))?;
20+
state.serialize_element(&TypedReflectSerializer::new_internal(
21+
value,
22+
self.registry,
23+
self.processor,
24+
))?;
2425
}
2526
state.end()
2627
}

crates/bevy_reflect/src/serde/ser/enums.rs

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,16 @@ use serde::{
77
Serialize,
88
};
99

10-
/// A serializer for [`Enum`] values.
11-
pub(super) struct EnumSerializer<'a> {
12-
enum_value: &'a dyn Enum,
13-
registry: &'a TypeRegistry,
14-
}
10+
use super::ReflectSerializerProcessor;
1511

16-
impl<'a> EnumSerializer<'a> {
17-
pub fn new(enum_value: &'a dyn Enum, registry: &'a TypeRegistry) -> Self {
18-
Self {
19-
enum_value,
20-
registry,
21-
}
22-
}
12+
/// A serializer for [`Enum`] values.
13+
pub(super) struct EnumSerializer<'a, P> {
14+
pub enum_value: &'a dyn Enum,
15+
pub registry: &'a TypeRegistry,
16+
pub processor: Option<&'a P>,
2317
}
2418

25-
impl<'a> Serialize for EnumSerializer<'a> {
19+
impl<P: ReflectSerializerProcessor> Serialize for EnumSerializer<'_, P> {
2620
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
2721
where
2822
S: serde::Serializer,
@@ -86,7 +80,11 @@ impl<'a> Serialize for EnumSerializer<'a> {
8680
let field_info = struct_info.field_at(index).unwrap();
8781
state.serialize_field(
8882
field_info.name(),
89-
&TypedReflectSerializer::new_internal(field.value(), self.registry),
83+
&TypedReflectSerializer::new_internal(
84+
field.value(),
85+
self.registry,
86+
self.processor,
87+
),
9088
)?;
9189
}
9290
state.end()
@@ -97,14 +95,17 @@ impl<'a> Serialize for EnumSerializer<'a> {
9795
if type_info.type_path_table().module_path() == Some("core::option")
9896
&& type_info.type_path_table().ident() == Some("Option")
9997
{
100-
serializer
101-
.serialize_some(&TypedReflectSerializer::new_internal(field, self.registry))
98+
serializer.serialize_some(&TypedReflectSerializer::new_internal(
99+
field,
100+
self.registry,
101+
self.processor,
102+
))
102103
} else {
103104
serializer.serialize_newtype_variant(
104105
enum_name,
105106
variant_index,
106107
variant_name,
107-
&TypedReflectSerializer::new_internal(field, self.registry),
108+
&TypedReflectSerializer::new_internal(field, self.registry, self.processor),
108109
)
109110
}
110111
}
@@ -119,6 +120,7 @@ impl<'a> Serialize for EnumSerializer<'a> {
119120
state.serialize_field(&TypedReflectSerializer::new_internal(
120121
field.value(),
121122
self.registry,
123+
self.processor,
122124
))?;
123125
}
124126
state.end()

crates/bevy_reflect/src/serde/ser/lists.rs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,27 @@
11
use crate::{serde::TypedReflectSerializer, List, TypeRegistry};
22
use serde::{ser::SerializeSeq, Serialize};
33

4-
/// A serializer for [`List`] values.
5-
pub(super) struct ListSerializer<'a> {
6-
list: &'a dyn List,
7-
registry: &'a TypeRegistry,
8-
}
4+
use super::ReflectSerializerProcessor;
95

10-
impl<'a> ListSerializer<'a> {
11-
pub fn new(list: &'a dyn List, registry: &'a TypeRegistry) -> Self {
12-
Self { list, registry }
13-
}
6+
/// A serializer for [`List`] values.
7+
pub(super) struct ListSerializer<'a, P> {
8+
pub list: &'a dyn List,
9+
pub registry: &'a TypeRegistry,
10+
pub processor: Option<&'a P>,
1411
}
1512

16-
impl<'a> Serialize for ListSerializer<'a> {
13+
impl<P: ReflectSerializerProcessor> Serialize for ListSerializer<'_, P> {
1714
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1815
where
1916
S: serde::Serializer,
2017
{
2118
let mut state = serializer.serialize_seq(Some(self.list.len()))?;
2219
for value in self.list.iter() {
23-
state.serialize_element(&TypedReflectSerializer::new_internal(value, self.registry))?;
20+
state.serialize_element(&TypedReflectSerializer::new_internal(
21+
value,
22+
self.registry,
23+
self.processor,
24+
))?;
2425
}
2526
state.end()
2627
}

crates/bevy_reflect/src/serde/ser/maps.rs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,25 @@
11
use crate::{serde::TypedReflectSerializer, Map, TypeRegistry};
22
use serde::{ser::SerializeMap, Serialize};
33

4-
/// A serializer for [`Map`] values.
5-
pub(super) struct MapSerializer<'a> {
6-
map: &'a dyn Map,
7-
registry: &'a TypeRegistry,
8-
}
4+
use super::ReflectSerializerProcessor;
95

10-
impl<'a> MapSerializer<'a> {
11-
pub fn new(map: &'a dyn Map, registry: &'a TypeRegistry) -> Self {
12-
Self { map, registry }
13-
}
6+
/// A serializer for [`Map`] values.
7+
pub(super) struct MapSerializer<'a, P> {
8+
pub map: &'a dyn Map,
9+
pub registry: &'a TypeRegistry,
10+
pub processor: Option<&'a P>,
1411
}
1512

16-
impl<'a> Serialize for MapSerializer<'a> {
13+
impl<P: ReflectSerializerProcessor> Serialize for MapSerializer<'_, P> {
1714
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1815
where
1916
S: serde::Serializer,
2017
{
2118
let mut state = serializer.serialize_map(Some(self.map.len()))?;
2219
for (key, value) in self.map.iter() {
2320
state.serialize_entry(
24-
&TypedReflectSerializer::new_internal(key, self.registry),
25-
&TypedReflectSerializer::new_internal(value, self.registry),
21+
&TypedReflectSerializer::new_internal(key, self.registry, self.processor),
22+
&TypedReflectSerializer::new_internal(value, self.registry, self.processor),
2623
)?;
2724
}
2825
state.end()

0 commit comments

Comments
 (0)