8
8
// licenses.
9
9
10
10
macro_rules! encode_tlv {
11
+ ( $stream: expr, $type: expr, $field: expr, ( default_value, $default: expr) ) => {
12
+ encode_tlv!( $stream, $type, $field, required)
13
+ } ;
11
14
( $stream: expr, $type: expr, $field: expr, required) => {
12
15
BigSize ( $type) . write( $stream) ?;
13
16
BigSize ( $field. serialized_length( ) as u64 ) . write( $stream) ?;
@@ -26,7 +29,7 @@ macro_rules! encode_tlv {
26
29
}
27
30
28
31
macro_rules! encode_tlv_stream {
29
- ( $stream: expr, { $( ( $type: expr, $field: expr, $fieldty: ident ) ) ,* $( , ) * } ) => { {
32
+ ( $stream: expr, { $( ( $type: expr, $field: expr, $fieldty: tt ) ) ,* $( , ) * } ) => { {
30
33
#[ allow( unused_imports) ]
31
34
use {
32
35
ln:: msgs:: DecodeError ,
@@ -53,6 +56,9 @@ macro_rules! encode_tlv_stream {
53
56
}
54
57
55
58
macro_rules! get_varint_length_prefixed_tlv_length {
59
+ ( $len: expr, $type: expr, $field: expr, ( default_value, $default: expr) ) => {
60
+ get_varint_length_prefixed_tlv_length!( $len, $type, $field, required)
61
+ } ;
56
62
( $len: expr, $type: expr, $field: expr, required) => {
57
63
BigSize ( $type) . write( & mut $len) . expect( "No in-memory data may fail to serialize" ) ;
58
64
let field_len = $field. serialized_length( ) ;
@@ -73,7 +79,7 @@ macro_rules! get_varint_length_prefixed_tlv_length {
73
79
}
74
80
75
81
macro_rules! encode_varint_length_prefixed_tlv {
76
- ( $stream: expr, { $( ( $type: expr, $field: expr, $fieldty: ident ) ) ,* } ) => { {
82
+ ( $stream: expr, { $( ( $type: expr, $field: expr, $fieldty: tt ) ) ,* } ) => { {
77
83
use util:: ser:: BigSize ;
78
84
let len = {
79
85
#[ allow( unused_mut) ]
@@ -89,38 +95,55 @@ macro_rules! encode_varint_length_prefixed_tlv {
89
95
}
90
96
91
97
macro_rules! check_tlv_order {
92
- ( $last_seen_type: expr, $typ: expr, $type: expr, required) => { {
98
+ ( $last_seen_type: expr, $typ: expr, $type: expr, $field: ident, ( default_value, $default: expr) ) => { {
99
+ #[ allow( unused_comparisons) ] // Note that $type may be 0 making the second comparison always true
100
+ let invalid_order = ( $last_seen_type. is_none( ) || $last_seen_type. unwrap( ) < $type) && $typ. 0 > $type;
101
+ if invalid_order {
102
+ $field = $default;
103
+ }
104
+ } } ;
105
+ ( $last_seen_type: expr, $typ: expr, $type: expr, $field: ident, required) => { {
93
106
#[ allow( unused_comparisons) ] // Note that $type may be 0 making the second comparison always true
94
107
let invalid_order = ( $last_seen_type. is_none( ) || $last_seen_type. unwrap( ) < $type) && $typ. 0 > $type;
95
108
if invalid_order {
96
109
return Err ( DecodeError :: InvalidValue ) ;
97
110
}
98
111
} } ;
99
- ( $last_seen_type: expr, $typ: expr, $type: expr, option) => { {
112
+ ( $last_seen_type: expr, $typ: expr, $type: expr, $field : ident , option) => { {
100
113
// no-op
101
114
} } ;
102
- ( $last_seen_type: expr, $typ: expr, $type: expr, vec_type) => { {
115
+ ( $last_seen_type: expr, $typ: expr, $type: expr, $field : ident , vec_type) => { {
103
116
// no-op
104
117
} } ;
105
118
}
106
119
107
120
macro_rules! check_missing_tlv {
108
- ( $last_seen_type: expr, $type: expr, required) => { {
121
+ ( $last_seen_type: expr, $type: expr, $field: ident, ( default_value, $default: expr) ) => { {
122
+ #[ allow( unused_comparisons) ] // Note that $type may be 0 making the second comparison always true
123
+ let missing_req_type = $last_seen_type. is_none( ) || $last_seen_type. unwrap( ) < $type;
124
+ if missing_req_type {
125
+ $field = $default;
126
+ }
127
+ } } ;
128
+ ( $last_seen_type: expr, $type: expr, $field: ident, required) => { {
109
129
#[ allow( unused_comparisons) ] // Note that $type may be 0 making the second comparison always true
110
130
let missing_req_type = $last_seen_type. is_none( ) || $last_seen_type. unwrap( ) < $type;
111
131
if missing_req_type {
112
132
return Err ( DecodeError :: InvalidValue ) ;
113
133
}
114
134
} } ;
115
- ( $last_seen_type: expr, $type: expr, vec_type) => { {
135
+ ( $last_seen_type: expr, $type: expr, $field : ident , vec_type) => { {
116
136
// no-op
117
137
} } ;
118
- ( $last_seen_type: expr, $type: expr, option) => { {
138
+ ( $last_seen_type: expr, $type: expr, $field : ident , option) => { {
119
139
// no-op
120
140
} } ;
121
141
}
122
142
123
143
macro_rules! decode_tlv {
144
+ ( $reader: expr, $field: ident, ( default_value, $default: expr) ) => { {
145
+ decode_tlv!( $reader, $field, required)
146
+ } } ;
124
147
( $reader: expr, $field: ident, required) => { {
125
148
$field = ser:: Readable :: read( & mut $reader) ?;
126
149
} } ;
@@ -133,7 +156,7 @@ macro_rules! decode_tlv {
133
156
}
134
157
135
158
macro_rules! decode_tlv_stream {
136
- ( $stream: expr, { $( ( $type: expr, $field: ident, $fieldty: ident ) ) ,* $( , ) * } ) => { {
159
+ ( $stream: expr, { $( ( $type: expr, $field: ident, $fieldty: tt ) ) ,* $( , ) * } ) => { {
137
160
use ln:: msgs:: DecodeError ;
138
161
let mut last_seen_type: Option <u64 > = None ;
139
162
let mut stream_ref = $stream;
@@ -169,7 +192,7 @@ macro_rules! decode_tlv_stream {
169
192
}
170
193
// As we read types, make sure we hit every required type:
171
194
$( {
172
- check_tlv_order!( last_seen_type, typ, $type, $fieldty) ;
195
+ check_tlv_order!( last_seen_type, typ, $type, $field , $ fieldty) ;
173
196
} ) *
174
197
last_seen_type = Some ( typ. 0 ) ;
175
198
@@ -193,7 +216,7 @@ macro_rules! decode_tlv_stream {
193
216
}
194
217
// Make sure we got to each required type after we've read every TLV:
195
218
$( {
196
- check_missing_tlv!( last_seen_type, $type, $fieldty) ;
219
+ check_missing_tlv!( last_seen_type, $type, $field , $ fieldty) ;
197
220
} ) *
198
221
} }
199
222
}
@@ -327,7 +350,7 @@ macro_rules! write_ver_prefix {
327
350
/// This is the preferred method of adding new fields that old nodes can ignore and still function
328
351
/// correctly.
329
352
macro_rules! write_tlv_fields {
330
- ( $stream: expr, { $( ( $type: expr, $field: expr, $fieldty: ident ) ) ,* $( , ) * } ) => {
353
+ ( $stream: expr, { $( ( $type: expr, $field: expr, $fieldty: tt ) ) ,* $( , ) * } ) => {
331
354
encode_varint_length_prefixed_tlv!( $stream, { $( ( $type, $field, $fieldty) ) ,* } ) ;
332
355
}
333
356
}
@@ -348,7 +371,7 @@ macro_rules! read_ver_prefix {
348
371
349
372
/// Reads a suffix added by write_tlv_fields.
350
373
macro_rules! read_tlv_fields {
351
- ( $stream: expr, { $( ( $type: expr, $field: ident, $fieldty: ident ) ) ,* $( , ) * } ) => { {
374
+ ( $stream: expr, { $( ( $type: expr, $field: ident, $fieldty: tt ) ) ,* $( , ) * } ) => { {
352
375
let tlv_len = :: util:: ser:: BigSize :: read( $stream) ?;
353
376
let mut rd = :: util:: ser:: FixedLengthReader :: new( $stream, tlv_len. 0 ) ;
354
377
decode_tlv_stream!( & mut rd, { $( ( $type, $field, $fieldty) ) ,* } ) ;
@@ -357,6 +380,9 @@ macro_rules! read_tlv_fields {
357
380
}
358
381
359
382
macro_rules! init_tlv_based_struct_field {
383
+ ( $field: ident, ( default_value, $default: expr) ) => {
384
+ $field
385
+ } ;
360
386
( $field: ident, option) => {
361
387
$field
362
388
} ;
@@ -369,6 +395,9 @@ macro_rules! init_tlv_based_struct_field {
369
395
}
370
396
371
397
macro_rules! init_tlv_field_var {
398
+ ( $field: ident, ( default_value, $default: expr) ) => {
399
+ let mut $field = $default;
400
+ } ;
372
401
( $field: ident, required) => {
373
402
let mut $field = :: util:: ser:: OptionDeserWrapper ( None ) ;
374
403
} ;
@@ -386,7 +415,7 @@ macro_rules! init_tlv_field_var {
386
415
/// if $fieldty is `vec_type`, then $field is a Vec, which needs to have its individual elements
387
416
/// serialized.
388
417
macro_rules! impl_writeable_tlv_based {
389
- ( $st: ident, { $( ( $type: expr, $field: ident, $fieldty: ident ) ) ,* $( , ) * } ) => {
418
+ ( $st: ident, { $( ( $type: expr, $field: ident, $fieldty: tt ) ) ,* $( , ) * } ) => {
390
419
impl :: util:: ser:: Writeable for $st {
391
420
fn write<W : :: util:: ser:: Writer >( & self , writer: & mut W ) -> Result <( ) , $crate:: io:: Error > {
392
421
write_tlv_fields!( writer, {
@@ -442,7 +471,7 @@ macro_rules! impl_writeable_tlv_based {
442
471
/// Attempts to read an unknown type byte result in DecodeError::UnknownRequiredFeature.
443
472
macro_rules! impl_writeable_tlv_based_enum {
444
473
( $st: ident, $( ( $variant_id: expr, $variant_name: ident) =>
445
- { $( ( $type: expr, $field: ident, $fieldty: ident ) ) ,* $( , ) * }
474
+ { $( ( $type: expr, $field: ident, $fieldty: tt ) ) ,* $( , ) * }
446
475
) ,* $( , ) * ;
447
476
$( ( $tuple_variant_id: expr, $tuple_variant_name: ident) ) ,* $( , ) * ) => {
448
477
impl :: util:: ser:: Writeable for $st {
0 commit comments