@@ -48,6 +48,10 @@ macro_rules! _encode_tlv {
48
48
( $stream: expr, $type: expr, $field: expr, ( option, encoding: $fieldty: ty) ) => {
49
49
$crate:: _encode_tlv!( $stream, $type, $field, option) ;
50
50
} ;
51
+ ( $stream: expr, $type: expr, $field: expr, ( option: $trait: ident $( , $read_arg: expr) ?) ) => {
52
+ // Just a read-mapped type
53
+ $crate:: _encode_tlv!( $stream, $type, $field, option) ;
54
+ } ;
51
55
}
52
56
53
57
/// Panics if the last seen TLV type is not numerically less than the TLV type currently being checked.
@@ -158,6 +162,9 @@ macro_rules! _get_varint_length_prefixed_tlv_length {
158
162
$len. 0 += field_len;
159
163
}
160
164
} ;
165
+ ( $len: expr, $type: expr, $field: expr, ( option: $trait: ident $( , $read_arg: expr) ?) ) => {
166
+ $crate:: _get_varint_length_prefixed_tlv_length!( $len, $type, $field, option) ;
167
+ } ;
161
168
( $len: expr, $type: expr, $field: expr, ignorable) => {
162
169
$crate:: _get_varint_length_prefixed_tlv_length!( $len, $type, $field, required) ;
163
170
} ;
@@ -204,6 +211,9 @@ macro_rules! _check_decoded_tlv_order {
204
211
return Err ( DecodeError :: InvalidValue ) ;
205
212
}
206
213
} } ;
214
+ ( $last_seen_type: expr, $typ: expr, $type: expr, $field: ident, ( required: $trait: ident $( , $read_arg: expr) ?) ) => { {
215
+ $crate:: _check_decoded_tlv_order!( $last_seen_type, $typ, $type, $field, required) ;
216
+ } } ;
207
217
( $last_seen_type: expr, $typ: expr, $type: expr, $field: ident, option) => { {
208
218
// no-op
209
219
} } ;
@@ -243,6 +253,9 @@ macro_rules! _check_missing_tlv {
243
253
return Err ( DecodeError :: InvalidValue ) ;
244
254
}
245
255
} } ;
256
+ ( $last_seen_type: expr, $type: expr, $field: ident, ( required: $trait: ident $( , $read_arg: expr) ?) ) => { {
257
+ $crate:: _check_missing_tlv!( $last_seen_type, $type, $field, required) ;
258
+ } } ;
246
259
( $last_seen_type: expr, $type: expr, $field: ident, vec_type) => { {
247
260
// no-op
248
261
} } ;
@@ -273,6 +286,9 @@ macro_rules! _decode_tlv {
273
286
( $reader: expr, $field: ident, required) => { {
274
287
$field = $crate:: util:: ser:: Readable :: read( & mut $reader) ?;
275
288
} } ;
289
+ ( $reader: expr, $field: ident, ( required: $trait: ident $( , $read_arg: expr) ?) ) => { {
290
+ $field = $trait:: read( & mut $reader $( , $read_arg) * ) ?;
291
+ } } ;
276
292
( $reader: expr, $field: ident, vec_type) => { {
277
293
let f: $crate:: util:: ser:: WithoutLength <Vec <_>> = $crate:: util:: ser:: Readable :: read( & mut $reader) ?;
278
294
$field = Some ( f. 0 ) ;
@@ -620,6 +636,9 @@ macro_rules! _init_tlv_based_struct_field {
620
636
( $field: ident, option) => {
621
637
$field
622
638
} ;
639
+ ( $field: ident, ( option: $trait: ident $( , $read_arg: expr) ?) ) => {
640
+ $crate:: _init_tlv_based_struct_field!( $field, option)
641
+ } ;
623
642
( $field: ident, ignorable) => {
624
643
if $field. is_none( ) { return Ok ( None ) ; } else { $field. unwrap( ) }
625
644
} ;
@@ -646,12 +665,18 @@ macro_rules! _init_tlv_field_var {
646
665
( $field: ident, required) => {
647
666
let mut $field = $crate:: util:: ser:: OptionDeserWrapper ( None ) ;
648
667
} ;
668
+ ( $field: ident, ( required: $trait: ident $( , $read_arg: expr) ?) ) => {
669
+ $crate:: _init_tlv_field_var!( $field, required) ;
670
+ } ;
649
671
( $field: ident, vec_type) => {
650
672
let mut $field = Some ( Vec :: new( ) ) ;
651
673
} ;
652
674
( $field: ident, option) => {
653
675
let mut $field = None ;
654
676
} ;
677
+ ( $field: ident, ( option: $trait: ident $( , $read_arg: expr) ?) ) => {
678
+ $crate:: _init_tlv_field_var!( $field, option) ;
679
+ } ;
655
680
( $field: ident, ignorable) => {
656
681
let mut $field = None ;
657
682
} ;
0 commit comments