@@ -33,7 +33,10 @@ macro_rules! _encode_tlv {
33
33
$crate:: _encode_tlv!( $stream, $type, $field, required) ;
34
34
} ;
35
35
( $stream: expr, $type: expr, $field: expr, required_vec $( , $self: ident) ?) => {
36
- $crate:: _encode_tlv!( $stream, $type, $crate:: util:: ser:: WithoutLength ( & $field) , required) ;
36
+ $crate:: _encode_tlv!( $stream, $type, $crate:: util:: ser:: WithoutLength ( $field) , required) ;
37
+ } ;
38
+ ( $stream: expr, $type: expr, $field: expr, ( required_vec, encoding: ( $fieldty: ty, $encoding: ident) ) $( , $self: ident) ?) => {
39
+ $crate:: _encode_tlv!( $stream, $type, $encoding( $field) , required) ;
37
40
} ;
38
41
( $stream: expr, $optional_type: expr, $optional_field: expr, option $( , $self: ident) ?) => {
39
42
if let Some ( ref field) = $optional_field {
@@ -166,7 +169,7 @@ macro_rules! _encode_tlv_stream {
166
169
) *
167
170
for tlv in $extra_tlvs {
168
171
let ( typ, value) : & ( u64 , Vec <u8 >) = tlv;
169
- $crate:: _encode_tlv!( $stream, * typ, * value, required_vec) ;
172
+ $crate:: _encode_tlv!( $stream, * typ, value, required_vec) ;
170
173
}
171
174
172
175
#[ allow( unused_mut, unused_variables, unused_assignments) ]
@@ -207,11 +210,15 @@ macro_rules! _get_varint_length_prefixed_tlv_length {
207
210
$crate:: _get_varint_length_prefixed_tlv_length!( $len, $type, $field, required) ;
208
211
} ;
209
212
( $len: expr, $type: expr, $field: expr, required_vec $( , $self: ident) ?) => {
210
- let field = $crate:: util:: ser:: WithoutLength ( & $field) ;
213
+ let field = $crate:: util:: ser:: WithoutLength ( $field) ;
214
+ $crate:: _get_varint_length_prefixed_tlv_length!( $len, $type, field, required) ;
215
+ } ;
216
+ ( $len: expr, $type: expr, $field: expr, ( required_vec, encoding: ( $fieldty: ty, $encoding: ident) ) $( , $self: ident) ?) => {
217
+ let field = $encoding( $field) ;
211
218
$crate:: _get_varint_length_prefixed_tlv_length!( $len, $type, field, required) ;
212
219
} ;
213
220
( $len: expr, $optional_type: expr, $optional_field: expr, option $( , $self: ident) ?) => {
214
- if let Some ( ref field) = $optional_field {
221
+ if let Some ( ref field) = $optional_field. as_ref ( ) {
215
222
BigSize ( $optional_type)
216
223
. write( & mut $len)
217
224
. expect( "No in-memory data may fail to serialize" ) ;
@@ -265,7 +272,7 @@ macro_rules! _encode_varint_length_prefixed_tlv {
265
272
) *
266
273
for tlv in $extra_tlvs {
267
274
let ( typ, value) : & ( u64 , Vec <u8 >) = tlv;
268
- $crate:: _get_varint_length_prefixed_tlv_length!( len, * typ, * value, required_vec) ;
275
+ $crate:: _get_varint_length_prefixed_tlv_length!( len, * typ, value, required_vec) ;
269
276
}
270
277
len. 0
271
278
} ;
@@ -316,6 +323,9 @@ macro_rules! _check_decoded_tlv_order {
316
323
( $last_seen_type: expr, $typ: expr, $type: expr, $field: ident, required_vec) => { {
317
324
$crate:: _check_decoded_tlv_order!( $last_seen_type, $typ, $type, $field, required) ;
318
325
} } ;
326
+ ( $last_seen_type: expr, $typ: expr, $type: expr, $field: ident, ( required_vec, encoding: $encoding: tt) ) => { {
327
+ $crate:: _check_decoded_tlv_order!( $last_seen_type, $typ, $type, $field, required) ;
328
+ } } ;
319
329
( $last_seen_type: expr, $typ: expr, $type: expr, $field: ident, optional_vec) => { {
320
330
// no-op
321
331
} } ;
@@ -363,6 +373,9 @@ macro_rules! _check_missing_tlv {
363
373
( $last_seen_type: expr, $type: expr, $field: ident, required_vec) => { {
364
374
$crate:: _check_missing_tlv!( $last_seen_type, $type, $field, required) ;
365
375
} } ;
376
+ ( $last_seen_type: expr, $type: expr, $field: ident, ( required_vec, encoding: $encoding: tt) ) => { {
377
+ $crate:: _check_missing_tlv!( $last_seen_type, $type, $field, required) ;
378
+ } } ;
366
379
( $last_seen_type: expr, $type: expr, $field: ident, option) => { {
367
380
// no-op
368
381
} } ;
@@ -412,6 +425,12 @@ macro_rules! _decode_tlv {
412
425
let f: $crate:: util:: ser:: WithoutLength <Vec <_>> = $crate:: util:: ser:: LengthReadable :: read_from_fixed_length_buffer( & mut $reader) ?;
413
426
$field = f. 0 ;
414
427
} } ;
428
+ ( $outer_reader: expr, $reader: expr, $field: ident, ( required_vec, encoding: ( $fieldty: ty, $encoding: ident) ) ) => { {
429
+ $field = {
430
+ let field: $encoding<$fieldty> = ser:: LengthReadable :: read_from_fixed_length_buffer( & mut $reader) ?;
431
+ $crate:: util:: ser:: RequiredWrapper ( Some ( field. 0 ) )
432
+ } ;
433
+ } } ;
415
434
( $outer_reader: expr, $reader: expr, $field: ident, option) => { {
416
435
$field = Some ( $crate:: util:: ser:: LengthReadable :: read_from_fixed_length_buffer( & mut $reader) ?) ;
417
436
} } ;
@@ -762,7 +781,7 @@ macro_rules! write_ver_prefix {
762
781
#[ macro_export]
763
782
macro_rules! write_tlv_fields {
764
783
( $stream: expr, { $( ( $type: expr, $field: expr, $fieldty: tt) ) ,* $( , ) * } ) => {
765
- $crate:: _encode_varint_length_prefixed_tlv!( $stream, { $( ( $type, $field, $fieldty) ) ,* } )
784
+ $crate:: _encode_varint_length_prefixed_tlv!( $stream, { $( ( $type, & $field, $fieldty) ) ,* } )
766
785
}
767
786
}
768
787
@@ -830,6 +849,9 @@ macro_rules! _init_tlv_based_struct_field {
830
849
( $field: ident, required_vec) => {
831
850
$field
832
851
} ;
852
+ ( $field: ident, ( required_vec, encoding: ( $fieldty: ty, $encoding: ident) ) ) => {
853
+ $crate:: _init_tlv_based_struct_field!( $field, required)
854
+ } ;
833
855
( $field: ident, optional_vec) => {
834
856
$field. unwrap( )
835
857
} ;
@@ -856,6 +878,9 @@ macro_rules! _init_tlv_field_var {
856
878
( $field: ident, required_vec) => {
857
879
let mut $field = Vec :: new( ) ;
858
880
} ;
881
+ ( $field: ident, ( required_vec, encoding: ( $fieldty: ty, $encoding: ident) ) ) => {
882
+ $crate:: _init_tlv_field_var!( $field, required) ;
883
+ } ;
859
884
( $field: ident, option) => {
860
885
let mut $field = None ;
861
886
} ;
@@ -983,7 +1008,7 @@ macro_rules! impl_writeable_tlv_based {
983
1008
impl $crate:: util:: ser:: Writeable for $st {
984
1009
fn write<W : $crate:: util:: ser:: Writer >( & self , writer: & mut W ) -> Result <( ) , $crate:: io:: Error > {
985
1010
$crate:: _encode_varint_length_prefixed_tlv!( writer, {
986
- $( ( $type, self . $field, $fieldty, self ) ) ,*
1011
+ $( ( $type, & self . $field, $fieldty, self ) ) ,*
987
1012
} ) ;
988
1013
Ok ( ( ) )
989
1014
}
@@ -995,7 +1020,7 @@ macro_rules! impl_writeable_tlv_based {
995
1020
#[ allow( unused_mut) ]
996
1021
let mut len = $crate:: util:: ser:: LengthCalculatingWriter ( 0 ) ;
997
1022
$(
998
- $crate:: _get_varint_length_prefixed_tlv_length!( len, $type, self . $field, $fieldty, self ) ;
1023
+ $crate:: _get_varint_length_prefixed_tlv_length!( len, $type, & self . $field, $fieldty, self ) ;
999
1024
) *
1000
1025
len. 0
1001
1026
} ;
@@ -1112,7 +1137,7 @@ macro_rules! _impl_writeable_tlv_based_enum_common {
1112
1137
let id: u8 = $variant_id;
1113
1138
id. write( writer) ?;
1114
1139
$crate:: _encode_varint_length_prefixed_tlv!( writer, {
1115
- $( ( $type, * $field, $fieldty, self ) ) ,*
1140
+ $( ( $type, $field, $fieldty, self ) ) ,*
1116
1141
} ) ;
1117
1142
} ) ,*
1118
1143
$( $st:: $tuple_variant_name ( ref field) => {
@@ -1370,7 +1395,8 @@ mod tests {
1370
1395
use crate :: io:: { self , Cursor } ;
1371
1396
use crate :: ln:: msgs:: DecodeError ;
1372
1397
use crate :: util:: ser:: {
1373
- HighZeroBytesDroppedBigSize , LengthReadable , MaybeReadable , Readable , VecWriter , Writeable ,
1398
+ HighZeroBytesDroppedBigSize , LengthReadable , MaybeReadable , Readable , VecWriter ,
1399
+ WithoutLength , Writeable ,
1374
1400
} ;
1375
1401
use bitcoin:: hex:: FromHex ;
1376
1402
use bitcoin:: secp256k1:: PublicKey ;
@@ -1879,4 +1905,23 @@ mod tests {
1879
1905
let read = <ExpandedField as Readable >:: read ( & mut & encoded[ ..] ) . unwrap ( ) ;
1880
1906
assert_eq ! ( read, ExpandedField { new_field: ( 42 , 0 ) } ) ;
1881
1907
}
1908
+
1909
+ #[ test]
1910
+ fn required_vec_with_encoding ( ) {
1911
+ // Ensure that serializing a required vec with a specified encoding will survive a ser round
1912
+ // trip.
1913
+ #[ derive( PartialEq , Eq , Debug ) ]
1914
+ struct MyCustomStruct {
1915
+ tlv_field : Vec < u8 > ,
1916
+ }
1917
+ impl_writeable_tlv_based ! ( MyCustomStruct , {
1918
+ ( 0 , tlv_field, ( required_vec, encoding: ( Vec <u8 >, WithoutLength ) ) ) ,
1919
+ } ) ;
1920
+
1921
+ let instance = MyCustomStruct { tlv_field : vec ! [ 42 ; 32 ] } ;
1922
+ let encoded = instance. encode ( ) ;
1923
+ let decoded: MyCustomStruct =
1924
+ LengthReadable :: read_from_fixed_length_buffer ( & mut & encoded[ ..] ) . unwrap ( ) ;
1925
+ assert_eq ! ( decoded, instance) ;
1926
+ }
1882
1927
}
0 commit comments