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
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
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
' tlv_read: loop {
@@ -168,7 +191,7 @@ macro_rules! decode_tlv_stream {
168
191
}
169
192
// As we read types, make sure we hit every required type:
170
193
$( {
171
- check_tlv_order!( last_seen_type, typ, $type, $fieldty) ;
194
+ check_tlv_order!( last_seen_type, typ, $type, $field , $ fieldty) ;
172
195
} ) *
173
196
last_seen_type = Some ( typ. 0 ) ;
174
197
@@ -192,7 +215,7 @@ macro_rules! decode_tlv_stream {
192
215
}
193
216
// Make sure we got to each required type after we've read every TLV:
194
217
$( {
195
- check_missing_tlv!( last_seen_type, $type, $fieldty) ;
218
+ check_missing_tlv!( last_seen_type, $type, $field , $ fieldty) ;
196
219
} ) *
197
220
} }
198
221
}
@@ -326,7 +349,7 @@ macro_rules! write_ver_prefix {
326
349
/// This is the preferred method of adding new fields that old nodes can ignore and still function
327
350
/// correctly.
328
351
macro_rules! write_tlv_fields {
329
- ( $stream: expr, { $( ( $type: expr, $field: expr, $fieldty: ident ) ) ,* $( , ) * } ) => {
352
+ ( $stream: expr, { $( ( $type: expr, $field: expr, $fieldty: tt ) ) ,* $( , ) * } ) => {
330
353
encode_varint_length_prefixed_tlv!( $stream, { $( ( $type, $field, $fieldty) ) ,* } ) ;
331
354
}
332
355
}
@@ -347,7 +370,7 @@ macro_rules! read_ver_prefix {
347
370
348
371
/// Reads a suffix added by write_tlv_fields.
349
372
macro_rules! read_tlv_fields {
350
- ( $stream: expr, { $( ( $type: expr, $field: ident, $fieldty: ident ) ) ,* $( , ) * } ) => { {
373
+ ( $stream: expr, { $( ( $type: expr, $field: ident, $fieldty: tt ) ) ,* $( , ) * } ) => { {
351
374
let tlv_len = :: util:: ser:: BigSize :: read( $stream) ?;
352
375
let mut rd = :: util:: ser:: FixedLengthReader :: new( $stream, tlv_len. 0 ) ;
353
376
decode_tlv_stream!( & mut rd, { $( ( $type, $field, $fieldty) ) ,* } ) ;
@@ -356,6 +379,9 @@ macro_rules! read_tlv_fields {
356
379
}
357
380
358
381
macro_rules! init_tlv_based_struct_field {
382
+ ( $field: ident, ( default_value, $default: expr) ) => {
383
+ $field
384
+ } ;
359
385
( $field: ident, option) => {
360
386
$field
361
387
} ;
@@ -368,6 +394,9 @@ macro_rules! init_tlv_based_struct_field {
368
394
}
369
395
370
396
macro_rules! init_tlv_field_var {
397
+ ( $field: ident, ( default_value, $default: expr) ) => {
398
+ let mut $field = $default;
399
+ } ;
371
400
( $field: ident, required) => {
372
401
let mut $field = :: util:: ser:: OptionDeserWrapper ( None ) ;
373
402
} ;
@@ -385,7 +414,7 @@ macro_rules! init_tlv_field_var {
385
414
/// if $fieldty is `vec_type`, then $field is a Vec, which needs to have its individual elements
386
415
/// serialized.
387
416
macro_rules! impl_writeable_tlv_based {
388
- ( $st: ident, { $( ( $type: expr, $field: ident, $fieldty: ident ) ) ,* $( , ) * } ) => {
417
+ ( $st: ident, { $( ( $type: expr, $field: ident, $fieldty: tt ) ) ,* $( , ) * } ) => {
389
418
impl :: util:: ser:: Writeable for $st {
390
419
fn write<W : :: util:: ser:: Writer >( & self , writer: & mut W ) -> Result <( ) , :: std:: io:: Error > {
391
420
write_tlv_fields!( writer, {
@@ -441,7 +470,7 @@ macro_rules! impl_writeable_tlv_based {
441
470
/// Attempts to read an unknown type byte result in DecodeError::UnknownRequiredFeature.
442
471
macro_rules! impl_writeable_tlv_based_enum {
443
472
( $st: ident, $( ( $variant_id: expr, $variant_name: ident) =>
444
- { $( ( $type: expr, $field: ident, $fieldty: ident ) ) ,* $( , ) * }
473
+ { $( ( $type: expr, $field: ident, $fieldty: tt ) ) ,* $( , ) * }
445
474
) ,* $( , ) * ;
446
475
$( ( $tuple_variant_id: expr, $tuple_variant_name: ident) ) ,* $( , ) * ) => {
447
476
impl :: util:: ser:: Writeable for $st {
0 commit comments