Skip to content

Commit

Permalink
Fix skip_serializing not using custom default functions
Browse files Browse the repository at this point in the history
  • Loading branch information
MrGVSV committed Oct 21, 2023
1 parent 9effa6f commit f10dd3a
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 17 deletions.
14 changes: 10 additions & 4 deletions crates/bevy_reflect/bevy_reflect_derive/src/serialization.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::derive_data::StructField;
use crate::field_attributes::ReflectIgnoreBehavior;
use crate::field_attributes::{DefaultBehavior, ReflectIgnoreBehavior};
use bevy_macro_utils::fq_std::{FQBox, FQDefault};
use quote::quote;
use std::collections::HashMap;
Expand Down Expand Up @@ -76,10 +76,16 @@ pub(crate) struct SkippedFieldDef {
impl SkippedFieldDef {
pub fn new(field: &StructField<'_>) -> Result<Self, syn::Error> {
let ty = &field.data.ty;
Ok(Self {
default_fn: quote! {

let default_fn = match &field.attrs.default {
DefaultBehavior::Func(func) => quote! {
|| { #FQBox::new(#func()) }
},
_ => quote! {
|| { #FQBox::new(<#ty as #FQDefault>::default()) }
},
})
};

Ok(Self { default_fn })
}
}
68 changes: 55 additions & 13 deletions crates/bevy_reflect/src/serde/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,14 @@ mod tests {
b: i32,
#[reflect(skip_serializing)]
c: i32,
#[reflect(skip_serializing)]
#[reflect(default = "custom_default")]
d: i32,
e: i32,
}

fn custom_default() -> i32 {
-1
}

let mut registry = TypeRegistry::default();
Expand All @@ -37,25 +44,42 @@ mod tests {
b: 4,
c: 5,
d: 6,
e: 7,
};

let serializer = ReflectSerializer::new(&test_struct, &registry);
let serialized =
ron::ser::to_string_pretty(&serializer, ron::ser::PrettyConfig::default()).unwrap();

let mut expected = DynamicStruct::default();
expected.insert("a", 3);
expected.insert("d", 6);
expected.insert("c", 0);

let mut deserializer = ron::de::Deserializer::from_str(&serialized).unwrap();
let reflect_deserializer = UntypedReflectDeserializer::new(&registry);
let value = reflect_deserializer.deserialize(&mut deserializer).unwrap();
let deserialized = value.take::<DynamicStruct>().unwrap();

let mut expected = DynamicStruct::default();
expected.insert("a", 3);
// Ignored: expected.insert("b", 0);
expected.insert("c", 0);
expected.insert("d", -1);
expected.insert("e", 7);

assert!(
expected.reflect_partial_eq(&deserialized).unwrap(),
"Expected {expected:?} found {deserialized:?}"
"Deserialization failed: expected {expected:?} found {deserialized:?}"
);

let expected = TestStruct {
a: 3,
b: 0,
c: 0,
d: -1,
e: 7,
};
let received = <TestStruct as FromReflect>::from_reflect(&deserialized).unwrap();

assert_eq!(
expected, received,
"FromReflect failed: expected {expected:?} found {received:?}"
);
}

Expand All @@ -67,31 +91,49 @@ mod tests {
i32,
#[reflect(ignore)] i32,
#[reflect(skip_serializing)] i32,
#[reflect(skip_serializing)]
#[reflect(default = "custom_default")]
i32,
i32,
);

fn custom_default() -> i32 {
-1
}

let mut registry = TypeRegistry::default();
registry.register::<TestStruct>();

let test_struct = TestStruct(3, 4, 5, 6);
let test_struct = TestStruct(3, 4, 5, 6, 7);

let serializer = ReflectSerializer::new(&test_struct, &registry);
let serialized =
ron::ser::to_string_pretty(&serializer, ron::ser::PrettyConfig::default()).unwrap();

let mut expected = DynamicTupleStruct::default();
expected.insert(3);
expected.insert(6);

let mut deserializer = ron::de::Deserializer::from_str(&serialized).unwrap();
let reflect_deserializer = UntypedReflectDeserializer::new(&registry);
let value = reflect_deserializer.deserialize(&mut deserializer).unwrap();
let deserialized = value.take::<DynamicTupleStruct>().unwrap();

let expected = TestStruct(3, 0, 0, 6);
let mut expected = DynamicTupleStruct::default();
expected.insert(3);
// Ignored: expected.insert(0);
expected.insert(0);
expected.insert(-1);
expected.insert(7);

assert!(
expected.reflect_partial_eq(&deserialized).unwrap(),
"Deserialization failed: expected {expected:?} found {deserialized:?}"
);

let expected = TestStruct(3, 0, 0, -1, 7);
let received = <TestStruct as FromReflect>::from_reflect(&deserialized).unwrap();

assert_eq!(expected, received);
assert_eq!(
expected, received,
"FromReflect failed: expected {expected:?} found {received:?}"
);
}

#[test]
Expand Down

0 comments on commit f10dd3a

Please sign in to comment.