bevy_reflect: Add GetTypeRegistration impl for reflected tuples (#4226)
# Objective Reflected tuples do not implement `GetTypeRegistration`, preventing us from registering our tuples, like: ```rust app.register_type::<(i32, i32)>(); ``` This is especially important for things like using #4042 to improve the scene format or implementing #4154 to recursively register fields. ## Solution Added an implementation to the tuple macro: ```rust impl<$($name: Reflect + for<'de> Deserialize<'de>),*> GetTypeRegistration for ($($name,)*) { fn get_type_registration() -> TypeRegistration { let mut registration = TypeRegistration::of::<($($name,)*)>(); registration.insert::<ReflectDeserialize>(FromType::<($($name,)*)>::from_type()); registration } } ``` This requires that the tuple's types implement `Deserialize`. This is exactly how `Vec` and `HashMap` handle it: ```rust impl<T: FromReflect + for<'de> Deserialize<'de>> GetTypeRegistration for Vec<T> { fn get_type_registration() -> TypeRegistration { let mut registration = TypeRegistration::of::<Vec<T>>(); registration.insert::<ReflectDeserialize>(FromType::<Vec<T>>::from_type()); registration } } ```
This commit is contained in:
parent
e29bd50de8
commit
4c194084b4
@ -1,7 +1,10 @@
|
|||||||
|
use crate::{
|
||||||
|
serde::Serializable, FromReflect, FromType, GetTypeRegistration, Reflect, ReflectDeserialize,
|
||||||
|
ReflectMut, ReflectRef, TypeRegistration,
|
||||||
|
};
|
||||||
|
use serde::Deserialize;
|
||||||
use std::any::Any;
|
use std::any::Any;
|
||||||
|
|
||||||
use crate::{serde::Serializable, FromReflect, Reflect, ReflectMut, ReflectRef};
|
|
||||||
|
|
||||||
/// A reflected Rust tuple.
|
/// A reflected Rust tuple.
|
||||||
///
|
///
|
||||||
/// This trait is automatically implemented for arbitrary tuples of up to 12
|
/// This trait is automatically implemented for arbitrary tuples of up to 12
|
||||||
@ -418,6 +421,14 @@ macro_rules! impl_reflect_tuple {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<$($name: Reflect + for<'de> Deserialize<'de>),*> GetTypeRegistration for ($($name,)*) {
|
||||||
|
fn get_type_registration() -> TypeRegistration {
|
||||||
|
let mut registration = TypeRegistration::of::<($($name,)*)>();
|
||||||
|
registration.insert::<ReflectDeserialize>(FromType::<($($name,)*)>::from_type());
|
||||||
|
registration
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<$($name: FromReflect),*> FromReflect for ($($name,)*)
|
impl<$($name: FromReflect),*> FromReflect for ($($name,)*)
|
||||||
{
|
{
|
||||||
fn from_reflect(reflect: &dyn Reflect) -> Option<Self> {
|
fn from_reflect(reflect: &dyn Reflect) -> Option<Self> {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user