@@ -7,7 +7,7 @@ use crate::{ErrorType, TypeAttrs, default_lifetime};
7
7
use field:: SequenceField ;
8
8
use proc_macro2:: TokenStream ;
9
9
use quote:: { ToTokens , quote} ;
10
- use syn:: { DeriveInput , GenericParam , Generics , Ident , LifetimeParam } ;
10
+ use syn:: { DeriveInput , GenericParam , Generics , Ident , Lifetime , LifetimeParam } ;
11
11
12
12
/// Derive the `Sequence` trait for a struct
13
13
pub ( crate ) struct DeriveSequence {
@@ -51,13 +51,10 @@ impl DeriveSequence {
51
51
} )
52
52
}
53
53
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 ) {
57
57
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.
61
58
let lifetime = generics
62
59
. lifetimes ( )
63
60
. next ( )
@@ -69,23 +66,39 @@ impl DeriveSequence {
69
66
. insert ( 0 , GenericParam :: Lifetime ( LifetimeParam :: new ( lt. clone ( ) ) ) ) ;
70
67
lt
71
68
} ) ;
72
-
73
69
// 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
+
74
79
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 ( ) ;
76
95
77
96
let mut decode_body = Vec :: new ( ) ;
78
97
let mut decode_result = Vec :: new ( ) ;
79
- let mut encoded_lengths = Vec :: new ( ) ;
80
- let mut encode_fields = Vec :: new ( ) ;
81
98
82
99
for field in & self . fields {
83
100
decode_body. push ( field. to_decode_tokens ( ) ) ;
84
101
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) ?; ) ) ;
89
102
}
90
103
91
104
let error = self . error . to_token_stream ( ) ;
@@ -109,6 +122,26 @@ impl DeriveSequence {
109
122
} )
110
123
}
111
124
}
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 ! {
112
145
113
146
impl #impl_generics :: der:: EncodeValue for #ident #ty_generics #where_clause {
114
147
fn value_len( & self ) -> :: der:: Result <:: der:: Length > {
@@ -127,8 +160,22 @@ impl DeriveSequence {
127
160
Ok ( ( ) )
128
161
}
129
162
}
163
+ }
164
+ }
130
165
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
132
179
}
133
180
}
134
181
}
0 commit comments