@@ -191,23 +191,35 @@ macro_rules! _get_varint_length_prefixed_tlv_length {
191
191
#[ doc( hidden) ]
192
192
#[ macro_export]
193
193
macro_rules! _encode_varint_length_prefixed_tlv {
194
- ( $stream: expr, { $( ( $type: expr, $field: expr, $fieldty: tt) ) ,* } ) => {
195
- _encode_varint_length_prefixed_tlv! ( $stream , { $ ( ( $type , $field , $fieldty ) ) , * } , & [ 0u8 ; 0 ] )
196
- } ;
197
- ( $stream : expr , { $ ( ( $type : expr , $field : expr , $fieldty : tt ) ) , * } , $extra : expr ) => { {
198
- // $extra should be a byte slice holding a valid TLV stream
194
+ ( $stream: expr, { $( ( $type: expr, $field: expr, $fieldty: tt) ) ,* } ) => { {
195
+ use alloc :: vec :: Vec ;
196
+ _encode_varint_length_prefixed_tlv! ( $stream , { $ ( ( $type , $field , $fieldty ) ) , * } , Vec :: < ( u64 , Vec < u8 > ) > :: new ( ) )
197
+ } } ;
198
+ ( $stream : expr , { $ ( ( $type : expr , $field : expr , $fieldty : tt ) ) , * } , $extra_tlvs : expr ) => { {
199
199
use $crate:: util:: ser:: BigSize ;
200
200
let len = {
201
201
#[ allow( unused_mut) ]
202
202
let mut len = $crate:: util:: ser:: LengthCalculatingWriter ( 0 ) ;
203
203
$(
204
204
$crate:: _get_varint_length_prefixed_tlv_length!( len, $type, $field, $fieldty) ;
205
205
) *
206
- len. 0 + $extra. len( )
206
+ for ( typ, value) in $extra_tlvs. iter( ) {
207
+ $crate:: _get_varint_length_prefixed_tlv_length!( len, * typ, * value, vec_type) ;
208
+ }
209
+ len. 0
207
210
} ;
208
211
BigSize ( len as u64 ) . write( $stream) ?;
209
212
$crate:: encode_tlv_stream!( $stream, { $( ( $type, $field, $fieldty) ) ,* } ) ;
210
- $stream. write_all( $extra) ?;
213
+ for ( typ, value) in $extra_tlvs. iter( ) {
214
+ $crate:: _encode_tlv!( $stream, * typ, * value, vec_type) ;
215
+ }
216
+
217
+ #[ cfg( debug_assertions) ] {
218
+ let mut last_seen: Option <u64 > = None ;
219
+ for ( typ, _) in $extra_tlvs. iter( ) {
220
+ $crate:: _check_encoded_tlv_order!( last_seen, * typ, vec_type) ;
221
+ }
222
+ }
211
223
} } ;
212
224
}
213
225
@@ -772,6 +784,7 @@ macro_rules! _init_and_read_tlv_fields {
772
784
/// For example,
773
785
/// ```
774
786
/// # use lightning::{impl_writeable_tlv_based, _encode_varint_length_prefixed_tlv};
787
+ /// # extern crate alloc;
775
788
/// struct LightningMessage {
776
789
/// tlv_integer: u32,
777
790
/// tlv_default_integer: u32,
@@ -1052,7 +1065,7 @@ mod tests {
1052
1065
use crate :: io:: { self , Cursor } ;
1053
1066
use crate :: prelude:: * ;
1054
1067
use crate :: ln:: msgs:: DecodeError ;
1055
- use crate :: util:: ser:: { Writer , Writeable , HighZeroBytesDroppedBigSize , VecWriter } ;
1068
+ use crate :: util:: ser:: { Writeable , HighZeroBytesDroppedBigSize , VecWriter } ;
1056
1069
use bitcoin:: secp256k1:: PublicKey ;
1057
1070
1058
1071
// The BOLT TLV test cases don't include any tests which use our "required-value" logic since
0 commit comments