Skip to content

Commit 914b518

Browse files
committed
wip: reflect serializer processor
1 parent 4227b75 commit 914b518

File tree

9 files changed

+236
-131
lines changed

9 files changed

+236
-131
lines changed

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)