@@ -51,6 +51,10 @@ macro_rules! _encode_tlv {
51
51
( $stream: expr, $type: expr, $field: expr, ( option, encoding: $fieldty: ty) ) => {
52
52
$crate:: _encode_tlv!( $stream, $type, $field, option) ;
53
53
} ;
54
+ ( $stream: expr, $type: expr, $field: expr, ( option: $trait: ident $( , $read_arg: expr) ?) ) => {
55
+ // Just a read-mapped type
56
+ $crate:: _encode_tlv!( $stream, $type, $field, option) ;
57
+ } ;
54
58
}
55
59
56
60
/// Panics if the last seen TLV type is not numerically less than the TLV type currently being checked.
@@ -161,6 +165,9 @@ macro_rules! _get_varint_length_prefixed_tlv_length {
161
165
$len. 0 += field_len;
162
166
}
163
167
} ;
168
+ ( $len: expr, $type: expr, $field: expr, ( option: $trait: ident $( , $read_arg: expr) ?) ) => {
169
+ $crate:: _get_varint_length_prefixed_tlv_length!( $len, $type, $field, option) ;
170
+ } ;
164
171
( $len: expr, $type: expr, $field: expr, upgradable_required) => {
165
172
$crate:: _get_varint_length_prefixed_tlv_length!( $len, $type, $field, required) ;
166
173
} ;
@@ -210,6 +217,9 @@ macro_rules! _check_decoded_tlv_order {
210
217
return Err ( DecodeError :: InvalidValue ) ;
211
218
}
212
219
} } ;
220
+ ( $last_seen_type: expr, $typ: expr, $type: expr, $field: ident, ( required: $trait: ident $( , $read_arg: expr) ?) ) => { {
221
+ $crate:: _check_decoded_tlv_order!( $last_seen_type, $typ, $type, $field, required) ;
222
+ } } ;
213
223
( $last_seen_type: expr, $typ: expr, $type: expr, $field: ident, option) => { {
214
224
// no-op
215
225
} } ;
@@ -252,6 +262,9 @@ macro_rules! _check_missing_tlv {
252
262
return Err ( DecodeError :: InvalidValue ) ;
253
263
}
254
264
} } ;
265
+ ( $last_seen_type: expr, $type: expr, $field: ident, ( required: $trait: ident $( , $read_arg: expr) ?) ) => { {
266
+ $crate:: _check_missing_tlv!( $last_seen_type, $type, $field, required) ;
267
+ } } ;
255
268
( $last_seen_type: expr, $type: expr, $field: ident, vec_type) => { {
256
269
// no-op
257
270
} } ;
@@ -285,6 +298,9 @@ macro_rules! _decode_tlv {
285
298
( $reader: expr, $field: ident, required) => { {
286
299
$field = $crate:: util:: ser:: Readable :: read( & mut $reader) ?;
287
300
} } ;
301
+ ( $reader: expr, $field: ident, ( required: $trait: ident $( , $read_arg: expr) ?) ) => { {
302
+ $field = $trait:: read( & mut $reader $( , $read_arg) * ) ?;
303
+ } } ;
288
304
( $reader: expr, $field: ident, vec_type) => { {
289
305
let f: $crate:: util:: ser:: WithoutLength <Vec <_>> = $crate:: util:: ser:: Readable :: read( & mut $reader) ?;
290
306
$field = Some ( f. 0 ) ;
@@ -644,6 +660,9 @@ macro_rules! _init_tlv_based_struct_field {
644
660
( $field: ident, option) => {
645
661
$field
646
662
} ;
663
+ ( $field: ident, ( option: $trait: ident $( , $read_arg: expr) ?) ) => {
664
+ $crate:: _init_tlv_based_struct_field!( $field, option)
665
+ } ;
647
666
( $field: ident, upgradable_required) => {
648
667
$field. 0 . unwrap( )
649
668
} ;
@@ -673,12 +692,18 @@ macro_rules! _init_tlv_field_var {
673
692
( $field: ident, required) => {
674
693
let mut $field = $crate:: util:: ser:: RequiredWrapper ( None ) ;
675
694
} ;
695
+ ( $field: ident, ( required: $trait: ident $( , $read_arg: expr) ?) ) => {
696
+ $crate:: _init_tlv_field_var!( $field, required) ;
697
+ } ;
676
698
( $field: ident, vec_type) => {
677
699
let mut $field = Some ( Vec :: new( ) ) ;
678
700
} ;
679
701
( $field: ident, option) => {
680
702
let mut $field = None ;
681
703
} ;
704
+ ( $field: ident, ( option: $trait: ident $( , $read_arg: expr) ?) ) => {
705
+ $crate:: _init_tlv_field_var!( $field, option) ;
706
+ } ;
682
707
( $field: ident, upgradable_required) => {
683
708
let mut $field = $crate:: util:: ser:: UpgradableRequired ( None ) ;
684
709
} ;
0 commit comments