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
	 MrGVSV
						MrGVSV