Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
9d59375
Add ReflectDeserializerProcessor
aecsocket Sep 27, 2024
8f5cd7b
fix clippy
aecsocket Sep 27, 2024
6749256
improve docs
aecsocket Sep 27, 2024
38e618f
address comments
aecsocket Sep 28, 2024
c8a3980
ReflectDeserializerProcessor `should_deserialize` returns the actual …
aecsocket Sep 29, 2024
5e6d02c
wip: switch to type param for reflect deserializer processor
aecsocket Sep 29, 2024
19bd7d8
fix processor
aecsocket Sep 29, 2024
56dbf02
get it working with the type system
aecsocket Sep 30, 2024
4a4993e
fix docs for deserialize processor
aecsocket Sep 30, 2024
2c983cc
fix doc tests
aecsocket Sep 30, 2024
1d5f725
Add default `P = ()` for ReflectDeserializer
aecsocket Sep 30, 2024
283bc15
add P = () to TypedReflectDeserializer as well
aecsocket Sep 30, 2024
4a4ddaf
Use `new_internal` in reflect deserializer
aecsocket Sep 30, 2024
7b534db
Provide access to TypeRegistry from processor
aecsocket Sep 30, 2024
06e1a65
doc fix
aecsocket Sep 30, 2024
428bfa2
fix doc tests
aecsocket Sep 30, 2024
c9168b6
Update for main
aecsocket Oct 4, 2024
bb1bc39
Address review comments
aecsocket Oct 4, 2024
fa1f55a
more docs and test for returning Box of wrong type
aecsocket Oct 4, 2024
e689f6b
clippy
aecsocket Oct 4, 2024
066d722
fix docs
aecsocket Oct 5, 2024
63dae42
wip: image pipeline example
aecsocket Oct 5, 2024
56c7e17
working logic
aecsocket Oct 5, 2024
e76e63d
Update examples/README.md
aecsocket Oct 5, 2024
18069a9
Add nicer image asset for image processor example
aecsocket Oct 5, 2024
9e447be
fix up rebase
aecsocket Oct 12, 2024
27a3183
further fix up rebase
aecsocket Oct 12, 2024
b00d98d
remove `as_ref`s
aecsocket Oct 16, 2024
7a652af
add more processor docs
aecsocket Oct 16, 2024
aa0d89b
remove example
aecsocket Oct 16, 2024
7faf965
switch to incorrect spelling
aecsocket Oct 29, 2024
b9eecfc
Add ReflectSerializerProcessor
aecsocket Sep 30, 2024
e55a4c7
fix up rebase
aecsocket Oct 12, 2024
a70451d
switch to incorrect spelling
aecsocket Oct 29, 2024
d265b9b
Add docs
aecsocket Oct 29, 2024
fba8187
Merge branch 'main' into feat/reflect-ser
aecsocket Nov 16, 2024
631d22e
Address review comments
aecsocket Nov 16, 2024
41384c9
replace `map(Ok)` with `Ok(Ok(..))` wrapping
aecsocket Nov 16, 2024
d99ca7c
fix doc
aecsocket Nov 16, 2024
3078fcd
doc cleanup
aecsocket Nov 16, 2024
dce23e6
fix doc
aecsocket Nov 16, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions crates/bevy_reflect/src/serde/de/processor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ use crate::{PartialReflect, TypeRegistration, TypeRegistry};
/// deserializer and give back a [`Box<dyn PartialReflect>`], or return
/// ownership of the deserializer back, and continue with the default logic.
///
/// The serialization equivalent of this is [`ReflectSerializerProcessor`].
///
/// # Compared to [`DeserializeWithRegistry`]
///
/// [`DeserializeWithRegistry`] allows you to define how your type will be
Expand Down Expand Up @@ -134,6 +136,7 @@ use crate::{PartialReflect, TypeRegistration, TypeRegistry};
/// [`TypedReflectDeserializer`]: crate::serde::TypedReflectDeserializer
/// [`try_deserialize`]: Self::try_deserialize
/// [`DeserializeWithRegistry`]: crate::serde::DeserializeWithRegistry
/// [`ReflectSerializerProcessor`]: crate::serde::ReflectSerializerProcessor
pub trait ReflectDeserializerProcessor {
/// Attempts to deserialize the value which a [`TypedReflectDeserializer`]
/// is currently looking at, and knows the type of.
Expand Down
23 changes: 12 additions & 11 deletions crates/bevy_reflect/src/serde/ser/arrays.rs
Original file line number Diff line number Diff line change
@@ -1,26 +1,27 @@
use crate::{serde::TypedReflectSerializer, Array, TypeRegistry};
use serde::{ser::SerializeTuple, Serialize};

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

impl<'a> ArraySerializer<'a> {
pub fn new(array: &'a dyn Array, registry: &'a TypeRegistry) -> Self {
Self { array, registry }
}
/// A serializer for [`Array`] values.
pub(super) struct ArraySerializer<'a, P> {
pub array: &'a dyn Array,
pub registry: &'a TypeRegistry,
pub processor: Option<&'a P>,
}

impl<'a> Serialize for ArraySerializer<'a> {
impl<P: ReflectSerializerProcessor> Serialize for ArraySerializer<'_, P> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let mut state = serializer.serialize_tuple(self.array.len())?;
for value in self.array.iter() {
state.serialize_element(&TypedReflectSerializer::new_internal(value, self.registry))?;
state.serialize_element(&TypedReflectSerializer::new_internal(
value,
self.registry,
self.processor,
))?;
}
state.end()
}
Expand Down
36 changes: 19 additions & 17 deletions crates/bevy_reflect/src/serde/ser/enums.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,16 @@ use serde::{
Serialize,
};

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

impl<'a> EnumSerializer<'a> {
pub fn new(enum_value: &'a dyn Enum, registry: &'a TypeRegistry) -> Self {
Self {
enum_value,
registry,
}
}
/// A serializer for [`Enum`] values.
pub(super) struct EnumSerializer<'a, P> {
pub enum_value: &'a dyn Enum,
pub registry: &'a TypeRegistry,
pub processor: Option<&'a P>,
}

impl<'a> Serialize for EnumSerializer<'a> {
impl<P: ReflectSerializerProcessor> Serialize for EnumSerializer<'_, P> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
Expand Down Expand Up @@ -86,7 +80,11 @@ impl<'a> Serialize for EnumSerializer<'a> {
let field_info = struct_info.field_at(index).unwrap();
state.serialize_field(
field_info.name(),
&TypedReflectSerializer::new_internal(field.value(), self.registry),
&TypedReflectSerializer::new_internal(
field.value(),
self.registry,
self.processor,
),
)?;
}
state.end()
Expand All @@ -97,14 +95,17 @@ impl<'a> Serialize for EnumSerializer<'a> {
if type_info.type_path_table().module_path() == Some("core::option")
&& type_info.type_path_table().ident() == Some("Option")
{
serializer
.serialize_some(&TypedReflectSerializer::new_internal(field, self.registry))
serializer.serialize_some(&TypedReflectSerializer::new_internal(
field,
self.registry,
self.processor,
))
} else {
serializer.serialize_newtype_variant(
enum_name,
variant_index,
variant_name,
&TypedReflectSerializer::new_internal(field, self.registry),
&TypedReflectSerializer::new_internal(field, self.registry, self.processor),
)
}
}
Expand All @@ -119,6 +120,7 @@ impl<'a> Serialize for EnumSerializer<'a> {
state.serialize_field(&TypedReflectSerializer::new_internal(
field.value(),
self.registry,
self.processor,
))?;
}
state.end()
Expand Down
23 changes: 12 additions & 11 deletions crates/bevy_reflect/src/serde/ser/lists.rs
Original file line number Diff line number Diff line change
@@ -1,26 +1,27 @@
use crate::{serde::TypedReflectSerializer, List, TypeRegistry};
use serde::{ser::SerializeSeq, Serialize};

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

impl<'a> ListSerializer<'a> {
pub fn new(list: &'a dyn List, registry: &'a TypeRegistry) -> Self {
Self { list, registry }
}
/// A serializer for [`List`] values.
pub(super) struct ListSerializer<'a, P> {
pub list: &'a dyn List,
pub registry: &'a TypeRegistry,
pub processor: Option<&'a P>,
}

impl<'a> Serialize for ListSerializer<'a> {
impl<P: ReflectSerializerProcessor> Serialize for ListSerializer<'_, P> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let mut state = serializer.serialize_seq(Some(self.list.len()))?;
for value in self.list.iter() {
state.serialize_element(&TypedReflectSerializer::new_internal(value, self.registry))?;
state.serialize_element(&TypedReflectSerializer::new_internal(
value,
self.registry,
self.processor,
))?;
}
state.end()
}
Expand Down
21 changes: 9 additions & 12 deletions crates/bevy_reflect/src/serde/ser/maps.rs
Original file line number Diff line number Diff line change
@@ -1,28 +1,25 @@
use crate::{serde::TypedReflectSerializer, Map, TypeRegistry};
use serde::{ser::SerializeMap, Serialize};

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

impl<'a> MapSerializer<'a> {
pub fn new(map: &'a dyn Map, registry: &'a TypeRegistry) -> Self {
Self { map, registry }
}
/// A serializer for [`Map`] values.
pub(super) struct MapSerializer<'a, P> {
pub map: &'a dyn Map,
pub registry: &'a TypeRegistry,
pub processor: Option<&'a P>,
}

impl<'a> Serialize for MapSerializer<'a> {
impl<P: ReflectSerializerProcessor> Serialize for MapSerializer<'_, P> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let mut state = serializer.serialize_map(Some(self.map.len()))?;
for (key, value) in self.map.iter() {
state.serialize_entry(
&TypedReflectSerializer::new_internal(key, self.registry),
&TypedReflectSerializer::new_internal(value, self.registry),
&TypedReflectSerializer::new_internal(key, self.registry, self.processor),
&TypedReflectSerializer::new_internal(value, self.registry, self.processor),
)?;
}
state.end()
Expand Down
Loading