@@ -2,7 +2,8 @@ use crate::{
22 ArrayInfo , DynamicArray , DynamicEnum , DynamicList , DynamicMap , DynamicStruct , DynamicTuple ,
33 DynamicTupleStruct , DynamicVariant , EnumInfo , ListInfo , Map , MapInfo , NamedField , Reflect ,
44 ReflectDeserialize , StructInfo , StructVariantInfo , Tuple , TupleInfo , TupleStruct ,
5- TupleStructInfo , TupleVariantInfo , TypeInfo , TypeRegistry , UnnamedField , VariantInfo ,
5+ TupleStructInfo , TupleVariantInfo , TypeInfo , TypeRegistration , TypeRegistry , UnnamedField ,
6+ VariantInfo ,
67} ;
78use erased_serde:: Deserializer ;
89use serde:: de:: {
@@ -192,11 +193,10 @@ impl<'a, 'de> Visitor<'de> for UntypedReflectDeserializerVisitor<'a> {
192193 . ok_or_else ( || Error :: invalid_length ( 0 , & "at least one entry" ) ) ?;
193194
194195 let registration = self . registry . get_with_name ( & type_name) . ok_or_else ( || {
195- Error :: custom ( format_args ! ( "No registration found for {} " , type_name) )
196+ Error :: custom ( format_args ! ( "No registration found for `{}` " , type_name) )
196197 } ) ?;
197- let type_info = registration. type_info ( ) ;
198198 let value = map. next_value_seed ( TypedReflectDeserializer {
199- type_info ,
199+ registration ,
200200 registry : self . registry ,
201201 } ) ?;
202202 Ok ( value)
@@ -222,14 +222,14 @@ impl<'a, 'de> Visitor<'de> for UntypedReflectDeserializerVisitor<'a> {
222222/// [`DynamicList`]: crate::DynamicList
223223/// [`FromReflect`]: crate::FromReflect
224224pub struct TypedReflectDeserializer < ' a > {
225- type_info : & ' static TypeInfo ,
225+ registration : & ' a TypeRegistration ,
226226 registry : & ' a TypeRegistry ,
227227}
228228
229229impl < ' a > TypedReflectDeserializer < ' a > {
230- pub fn new ( type_info : & ' static TypeInfo , registry : & ' a TypeRegistry ) -> Self {
230+ pub fn new ( registration : & ' a TypeRegistration , registry : & ' a TypeRegistry ) -> Self {
231231 Self {
232- type_info ,
232+ registration ,
233233 registry,
234234 }
235235 }
@@ -242,19 +242,15 @@ impl<'a, 'de> DeserializeSeed<'de> for TypedReflectDeserializer<'a> {
242242 where
243243 D : serde:: Deserializer < ' de > ,
244244 {
245- // Handle both Value case and types that have a custom `ReflectDeserialize`
246- let type_id = self . type_info . type_id ( ) ;
247- let type_name = self . type_info . type_name ( ) ;
248- let registration = self . registry . get ( type_id) . ok_or_else ( || {
249- de:: Error :: custom ( format_args ! ( "no registration found for {}" , type_name) )
250- } ) ?;
245+ let type_name = self . registration . type_name ( ) ;
251246
252- if let Some ( deserialize_reflect) = registration. data :: < ReflectDeserialize > ( ) {
247+ // Handle both Value case and types that have a custom `ReflectDeserialize`
248+ if let Some ( deserialize_reflect) = self . registration . data :: < ReflectDeserialize > ( ) {
253249 let value = deserialize_reflect. deserialize ( deserializer) ?;
254250 return Ok ( value) ;
255251 }
256252
257- match self . type_info {
253+ match self . registration . type_info ( ) {
258254 TypeInfo :: Struct ( struct_info) => {
259255 let mut dynamic_struct = deserializer. deserialize_struct (
260256 struct_info. name ( ) ,
@@ -395,19 +391,19 @@ impl<'a, 'de> Visitor<'de> for TupleStructVisitor<'a> {
395391 let mut index = 0usize ;
396392 let mut tuple_struct = DynamicTupleStruct :: default ( ) ;
397393
398- let get_field_info = |index : usize | -> Result < & ' static TypeInfo , V :: Error > {
394+ let get_field_registration = |index : usize | -> Result < & ' a TypeRegistration , V :: Error > {
399395 let field = self . tuple_struct_info . field_at ( index) . ok_or_else ( || {
400396 de:: Error :: custom ( format_args ! (
401397 "no field at index {} on tuple {}" ,
402398 index,
403399 self . tuple_struct_info. type_name( ) ,
404400 ) )
405401 } ) ?;
406- get_type_info ( field. type_id ( ) , field. type_name ( ) , self . registry )
402+ get_registration ( field. type_id ( ) , field. type_name ( ) , self . registry )
407403 } ;
408404
409405 while let Some ( value) = seq. next_element_seed ( TypedReflectDeserializer {
410- type_info : get_field_info ( index) ?,
406+ registration : get_field_registration ( index) ?,
411407 registry : self . registry ,
412408 } ) ? {
413409 tuple_struct. insert_boxed ( value) ;
@@ -465,13 +461,13 @@ impl<'a, 'de> Visitor<'de> for ArrayVisitor<'a> {
465461 V : SeqAccess < ' de > ,
466462 {
467463 let mut vec = Vec :: with_capacity ( seq. size_hint ( ) . unwrap_or_default ( ) ) ;
468- let type_info = get_type_info (
464+ let registration = get_registration (
469465 self . array_info . item_type_id ( ) ,
470466 self . array_info . item_type_name ( ) ,
471467 self . registry ,
472468 ) ?;
473469 while let Some ( value) = seq. next_element_seed ( TypedReflectDeserializer {
474- type_info ,
470+ registration ,
475471 registry : self . registry ,
476472 } ) ? {
477473 vec. push ( value) ;
@@ -505,13 +501,13 @@ impl<'a, 'de> Visitor<'de> for ListVisitor<'a> {
505501 V : SeqAccess < ' de > ,
506502 {
507503 let mut list = DynamicList :: default ( ) ;
508- let type_info = get_type_info (
504+ let registration = get_registration (
509505 self . list_info . item_type_id ( ) ,
510506 self . list_info . item_type_name ( ) ,
511507 self . registry ,
512508 ) ?;
513509 while let Some ( value) = seq. next_element_seed ( TypedReflectDeserializer {
514- type_info ,
510+ registration ,
515511 registry : self . registry ,
516512 } ) ? {
517513 list. push_box ( value) ;
@@ -537,22 +533,22 @@ impl<'a, 'de> Visitor<'de> for MapVisitor<'a> {
537533 V : MapAccess < ' de > ,
538534 {
539535 let mut dynamic_map = DynamicMap :: default ( ) ;
540- let key_type_info = get_type_info (
536+ let key_registration = get_registration (
541537 self . map_info . key_type_id ( ) ,
542538 self . map_info . key_type_name ( ) ,
543539 self . registry ,
544540 ) ?;
545- let value_type_info = get_type_info (
541+ let value_registration = get_registration (
546542 self . map_info . value_type_id ( ) ,
547543 self . map_info . value_type_name ( ) ,
548544 self . registry ,
549545 ) ?;
550546 while let Some ( key) = map. next_key_seed ( TypedReflectDeserializer {
551- type_info : key_type_info ,
547+ registration : key_registration ,
552548 registry : self . registry ,
553549 } ) ? {
554550 let value = map. next_value_seed ( TypedReflectDeserializer {
555- type_info : value_type_info ,
551+ registration : value_registration ,
556552 registry : self . registry ,
557553 } ) ?;
558554 dynamic_map. insert_boxed ( key, value) ;
@@ -596,9 +592,11 @@ impl<'a, 'de> Visitor<'de> for EnumVisitor<'a> {
596592 ) ?
597593 . into ( ) ,
598594 VariantInfo :: Tuple ( tuple_info) if tuple_info. field_len ( ) == 1 => {
599- let type_info = get_newtype_info ( tuple_info, self . registry ) ?;
595+ let field = tuple_info. field_at ( 0 ) . unwrap ( ) ;
596+ let registration =
597+ get_registration ( field. type_id ( ) , field. type_name ( ) , self . registry ) ?;
600598 let value = variant. newtype_variant_seed ( TypedReflectDeserializer {
601- type_info ,
599+ registration ,
602600 registry : self . registry ,
603601 } ) ?;
604602 let mut dynamic_tuple = DynamicTuple :: default ( ) ;
@@ -681,9 +679,11 @@ impl<'a, 'de> Visitor<'de> for OptionVisitor<'a> {
681679 let variant_info = self . enum_info . variant ( "Some" ) . unwrap ( ) ;
682680 match variant_info {
683681 VariantInfo :: Tuple ( tuple_info) if tuple_info. field_len ( ) == 1 => {
684- let type_info = get_newtype_info ( tuple_info, self . registry ) ?;
682+ let field = tuple_info. field_at ( 0 ) . unwrap ( ) ;
683+ let registration =
684+ get_registration ( field. type_id ( ) , field. type_name ( ) , self . registry ) ?;
685685 let de = TypedReflectDeserializer {
686- type_info ,
686+ registration ,
687687 registry : self . registry ,
688688 } ;
689689 let mut value = DynamicTuple :: default ( ) ;
@@ -723,9 +723,9 @@ where
723723 let field = info
724724 . get_field ( & key)
725725 . ok_or_else ( || Error :: unknown_field ( & key, info. get_field_names ( ) ) ) ?;
726- let type_info = get_type_info ( field. type_id ( ) , field. type_name ( ) , registry) ?;
726+ let registration = get_registration ( field. type_id ( ) , field. type_name ( ) , registry) ?;
727727 let value = map. next_value_seed ( TypedReflectDeserializer {
728- type_info ,
728+ registration ,
729729 registry,
730730 } ) ?;
731731 dynamic_struct. insert_boxed ( & key, value) ;
@@ -746,15 +746,15 @@ where
746746 let mut tuple = DynamicTuple :: default ( ) ;
747747 let mut index = 0usize ;
748748
749- let get_field_info = |index : usize | -> Result < & TypeInfo , V :: Error > {
749+ let get_field_registration = |index : usize | -> Result < & TypeRegistration , V :: Error > {
750750 let field = info. get_field ( index) . ok_or_else ( || {
751751 Error :: invalid_length ( index, & info. get_field_len ( ) . to_string ( ) . as_str ( ) )
752752 } ) ?;
753- get_type_info ( field. type_id ( ) , field. type_name ( ) , registry)
753+ get_registration ( field. type_id ( ) , field. type_name ( ) , registry)
754754 } ;
755755
756756 while let Some ( value) = seq. next_element_seed ( TypedReflectDeserializer {
757- type_info : get_field_info ( index) ?,
757+ registration : get_field_registration ( index) ?,
758758 registry,
759759 } ) ? {
760760 tuple. insert_boxed ( value) ;
@@ -776,32 +776,23 @@ where
776776 Ok ( tuple)
777777}
778778
779- fn get_newtype_info < E : Error > (
780- tuple_info : & ' static TupleVariantInfo ,
781- registry : & TypeRegistry ,
782- ) -> Result < & ' static TypeInfo , E > {
783- let field = tuple_info. field_at ( 0 ) . unwrap ( ) ;
784- registry. get_type_info ( field. type_id ( ) ) . ok_or_else ( || {
785- Error :: custom ( format_args ! (
786- "no registration found for type {}" ,
787- field. type_name( )
788- ) )
789- } )
790- }
791-
792- fn get_type_info < E : de:: Error > (
779+ fn get_registration < ' a , E : Error > (
793780 type_id : TypeId ,
794781 type_name : & str ,
795- registry : & TypeRegistry ,
796- ) -> Result < & ' static TypeInfo , E > {
782+ registry : & ' a TypeRegistry ,
783+ ) -> Result < & ' a TypeRegistration , E > {
797784 let registration = registry. get ( type_id) . ok_or_else ( || {
798- de:: Error :: custom ( format_args ! ( "no registration found for type {}" , type_name) )
785+ Error :: custom ( format_args ! (
786+ "no registration found for type `{}`" ,
787+ type_name
788+ ) )
799789 } ) ?;
800- Ok ( registration. type_info ( ) )
790+ Ok ( registration)
801791}
802792
803793#[ cfg( test) ]
804794mod tests {
795+ use std:: any:: TypeId ;
805796 use std:: f32:: consts:: PI ;
806797
807798 use serde:: de:: DeserializeSeed ;
@@ -811,7 +802,7 @@ mod tests {
811802
812803 use crate as bevy_reflect;
813804 use crate :: serde:: { TypedReflectDeserializer , UntypedReflectDeserializer } ;
814- use crate :: { DynamicEnum , FromReflect , Reflect , ReflectDeserialize , TypeRegistry , Typed } ;
805+ use crate :: { DynamicEnum , FromReflect , Reflect , ReflectDeserialize , TypeRegistry } ;
815806
816807 #[ derive( Reflect , FromReflect , Debug , PartialEq ) ]
817808 struct MyStruct {
@@ -997,7 +988,8 @@ mod tests {
997988
998989 let mut registry = get_registry ( ) ;
999990 registry. register :: < Foo > ( ) ;
1000- let reflect_deserializer = TypedReflectDeserializer :: new ( Foo :: type_info ( ) , & registry) ;
991+ let registration = registry. get ( TypeId :: of :: < Foo > ( ) ) . unwrap ( ) ;
992+ let reflect_deserializer = TypedReflectDeserializer :: new ( registration, & registry) ;
1001993 let mut ron_deserializer = ron:: de:: Deserializer :: from_str ( input) . unwrap ( ) ;
1002994 let dynamic_output = reflect_deserializer
1003995 . deserialize ( & mut ron_deserializer)
0 commit comments