@@ -87,12 +87,18 @@ impl<T: ConcreteType> TypeKind for T {
8787pub trait TypeSerde : Sized {
8888 type Header : Serialize + DeserializeOwned ;
8989 type Proxy : Serialize + DeserializeOwned ;
90+ fn has_header ( ) -> bool {
91+ true
92+ }
9093 fn get_header ( ) -> Self :: Header ;
9194 fn set_header ( header : Self :: Header ) ;
9295 fn get_proxy ( & ' static self ) -> Self :: Proxy ;
9396 fn from_proxy ( body : Self :: Proxy ) -> & ' static Self ;
9497}
9598pub trait TypeSerdeFns {
99+ fn has_header ( ) -> bool
100+ where
101+ Self : Sized ;
96102 fn erased_header ( ) -> Box < dyn erased_serde:: Serialize >
97103 where
98104 Self : Sized ;
@@ -109,6 +115,9 @@ pub trait TypeSerdeFns {
109115 Self : Sized ;
110116}
111117impl < T : Type + TypeSerde > TypeSerdeFns for T {
118+ fn has_header ( ) -> bool {
119+ <Self as TypeSerde >:: has_header ( )
120+ }
112121 fn erased_header ( ) -> Box < dyn erased_serde:: Serialize > {
113122 Box :: new ( Self :: get_header ( ) )
114123 }
@@ -136,6 +145,9 @@ pub trait NullType: Type {
136145impl < T : NullType > TypeSerde for T {
137146 type Header = ( ) ;
138147 type Proxy = ( ) ;
148+ fn has_header ( ) -> bool {
149+ false
150+ }
139151 fn get_header ( ) -> Self :: Header { }
140152 fn set_header ( header : Self :: Header ) { }
141153 fn get_proxy ( & ' static self ) -> Self :: Proxy { }
@@ -146,6 +158,9 @@ impl<T: NullType> TypeSerde for T {
146158macro_rules! no_type_header {
147159 ( ) => {
148160 type Header = ( ) ;
161+ fn has_header( ) -> bool {
162+ false
163+ }
149164 fn get_header( ) -> Self :: Header { }
150165 fn set_header( header: Self :: Header ) { }
151166 } ;
@@ -732,6 +747,8 @@ impl<'de> Deserialize<'de> for TypeRef {
732747}
733748pub struct TypeLoader {
734749 pub kind : u64 ,
750+ pub name : fn ( ) -> & ' static str ,
751+ pub has_header : fn ( ) -> bool ,
735752 pub erased_header : fn ( ) -> Box < dyn erased_serde:: Serialize > ,
736753 pub load_header : fn ( & mut dyn erased_serde:: Deserializer ) -> Result < ( ) , erased_serde:: Error > ,
737754 pub load : fn ( & mut dyn erased_serde:: Deserializer ) -> Result < TypeRef , erased_serde:: Error > ,
@@ -741,6 +758,11 @@ macro_rules! type_loader {
741758 ( $T: ty) => {
742759 $crate:: types:: TypeLoader {
743760 kind: <$T as $crate:: types:: ConcreteType >:: KIND ,
761+ name: || {
762+ let s = :: std:: any:: type_name:: <$T>( ) ;
763+ s. rsplit_once( "::" ) . map_or( s, |x| x. 1 )
764+ } ,
765+ has_header: <$T as $crate:: types:: TypeSerdeFns >:: has_header,
744766 erased_header: <$T as $crate:: types:: TypeSerdeFns >:: erased_header,
745767 load_header: <$T as $crate:: types:: TypeSerdeFns >:: load_header,
746768 load: <$T as $crate:: types:: TypeSerdeFns >:: load,
@@ -758,23 +780,29 @@ macro_rules! submit_types {
758780}
759781inventory:: collect!( TypeLoader ) ;
760782pub struct LoadInfo {
783+ pub has_header : fn ( ) -> bool ,
761784 pub erased_header : fn ( ) -> Box < dyn erased_serde:: Serialize > ,
762785 pub load_header : fn ( & mut dyn erased_serde:: Deserializer ) -> Result < ( ) , erased_serde:: Error > ,
763786 pub load : fn ( & mut dyn erased_serde:: Deserializer ) -> Result < TypeRef , erased_serde:: Error > ,
787+ pub name : & ' static str ,
764788}
765789impl LoadInfo {
766790 pub fn new (
767791 & TypeLoader {
768792 kind,
793+ has_header,
769794 erased_header,
770795 load_header,
771796 load,
797+ name,
772798 ..
773799 } : & ' static TypeLoader ,
774800 ) -> ( u64 , Self ) {
775801 (
776802 kind,
777803 Self {
804+ name : name ( ) ,
805+ has_header,
778806 erased_header,
779807 load_header,
780808 load,
0 commit comments