@@ -7,7 +7,7 @@ use crate::{ErrorType, TypeAttrs, default_lifetime};
77use  field:: SequenceField ; 
88use  proc_macro2:: TokenStream ; 
99use  quote:: { ToTokens ,  quote} ; 
10- use  syn:: { DeriveInput ,  GenericParam ,  Generics ,  Ident ,  LifetimeParam } ; 
10+ use  syn:: { DeriveInput ,  GenericParam ,  Generics ,  Ident ,  Lifetime ,   LifetimeParam } ; 
1111
1212/// Derive the `Sequence` trait for a struct 
1313pub ( crate )  struct  DeriveSequence  { 
@@ -51,13 +51,10 @@ impl DeriveSequence {
5151        } ) 
5252    } 
5353
54-     /// Lower  the derived output into a [`TokenStream`].  
55- pub   fn   to_tokens ( & self )  ->  TokenStream   { 
56-          let  ident =  & self . ident ; 
54+     /// Use  the first lifetime parameter as lifetime for Decode/Encode lifetime  
55+ /// if none found, add one. 
56+ fn   calc_lifetime ( & self )  ->  ( Generics ,   Lifetime )   { 
5757        let  mut  generics = self . generics . clone ( ) ; 
58- 
59-         // Use the first lifetime parameter as lifetime for Decode/Encode lifetime 
60-         // if none found, add one. 
6158        let  lifetime = generics
6259            . lifetimes ( ) 
6360            . next ( ) 
@@ -69,23 +66,39 @@ impl DeriveSequence {
6966                    . insert ( 0 ,  GenericParam :: Lifetime ( LifetimeParam :: new ( lt. clone ( ) ) ) ) ; 
7067                lt
7168            } ) ; 
72- 
7369        // We may or may not have inserted a lifetime. 
70+         ( generics,  lifetime) 
71+     } 
72+ 
73+     /// Lower the derived output into a [`TokenStream`] for Sequence trait impl. 
74+ pub  fn  to_tokens_sequence_trait ( & self )  -> TokenStream  { 
75+         let  ident = & self . ident ; 
76+ 
77+         let  ( der_generics,  lifetime)  = self . calc_lifetime ( ) ; 
78+ 
7479        let  ( _,  ty_generics,  where_clause)  = self . generics . split_for_impl ( ) ; 
75-         let  ( impl_generics,  _,  _)  = generics. split_for_impl ( ) ; 
80+         let  ( impl_generics,  _,  _)  = der_generics. split_for_impl ( ) ; 
81+ 
82+         quote !  { 
83+             impl  #impl_generics :: der:: Sequence <#lifetime> for  #ident #ty_generics #where_clause { } 
84+         } 
85+     } 
86+ 
87+     /// Lower the derived output into a [`TokenStream`] for DecodeValue trait impl. 
88+ pub  fn  to_tokens_decode ( & self )  -> TokenStream  { 
89+         let  ident = & self . ident ; 
90+ 
91+         let  ( der_generics,  lifetime)  = self . calc_lifetime ( ) ; 
92+ 
93+         let  ( _,  ty_generics,  where_clause)  = self . generics . split_for_impl ( ) ; 
94+         let  ( impl_generics,  _,  _)  = der_generics. split_for_impl ( ) ; 
7695
7796        let  mut  decode_body = Vec :: new ( ) ; 
7897        let  mut  decode_result = Vec :: new ( ) ; 
79-         let  mut  encoded_lengths = Vec :: new ( ) ; 
80-         let  mut  encode_fields = Vec :: new ( ) ; 
8198
8299        for  field in  & self . fields  { 
83100            decode_body. push ( field. to_decode_tokens ( ) ) ; 
84101            decode_result. push ( & field. ident ) ; 
85- 
86-             let  field = field. to_encode_tokens ( ) ; 
87-             encoded_lengths. push ( quote ! ( #field. encoded_len( ) ?) ) ; 
88-             encode_fields. push ( quote ! ( #field. encode( writer) ?; ) ) ; 
89102        } 
90103
91104        let  error = self . error . to_token_stream ( ) ; 
@@ -109,6 +122,26 @@ impl DeriveSequence {
109122                    } ) 
110123                } 
111124            } 
125+         } 
126+     } 
127+ 
128+     /// Lower the derived output into a [`TokenStream`] for EncodeValue trait impl. 
129+ pub  fn  to_tokens_encode ( & self )  -> TokenStream  { 
130+         let  ident = & self . ident ; 
131+ 
132+         let  ( _,  ty_generics,  where_clause)  = self . generics . split_for_impl ( ) ; 
133+         let  ( impl_generics,  _,  _)  = self . generics . split_for_impl ( ) ; 
134+ 
135+         let  mut  encoded_lengths = Vec :: new ( ) ; 
136+         let  mut  encode_fields = Vec :: new ( ) ; 
137+ 
138+         for  field in  & self . fields  { 
139+             let  field = field. to_encode_tokens ( ) ; 
140+             encoded_lengths. push ( quote ! ( #field. encoded_len( ) ?) ) ; 
141+             encode_fields. push ( quote ! ( #field. encode( writer) ?; ) ) ; 
142+         } 
143+ 
144+         quote !  { 
112145
113146            impl  #impl_generics :: der:: EncodeValue  for  #ident #ty_generics #where_clause { 
114147                fn  value_len( & self )  -> :: der:: Result <:: der:: Length > { 
@@ -127,8 +160,22 @@ impl DeriveSequence {
127160                    Ok ( ( ) ) 
128161                } 
129162            } 
163+         } 
164+     } 
130165
131-             impl  #impl_generics :: der:: Sequence <#lifetime> for  #ident #ty_generics #where_clause { } 
166+     /// Lower the derived output into a [`TokenStream`] for trait impls: 
167+ /// - EncodeValue 
168+ /// - DecodeValue 
169+ /// - Sequence 
170+ pub  fn  to_tokens_all ( & self )  -> TokenStream  { 
171+         let  decode_tokens = self . to_tokens_decode ( ) ; 
172+         let  encode_tokens = self . to_tokens_encode ( ) ; 
173+         let  sequence_trait_tokens = self . to_tokens_sequence_trait ( ) ; 
174+ 
175+         quote !  { 
176+             #decode_tokens
177+             #encode_tokens
178+             #sequence_trait_tokens
132179        } 
133180    } 
134181} 
0 commit comments