Skip to content

Commit 82ecda7

Browse files
committed
Support ReadableArgs types across in the TLV struct serialization
This adds `required` support for trait-wrapped reading (e.g. for objects read via `ReadableArgs`) as well as support for the trait-wrapped reading syntax across the TLV struct/enum serialization macros.
1 parent 6fb46db commit 82ecda7

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

lightning/src/util/ser.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,17 +289,23 @@ impl<T: Readable> MaybeReadable for T {
289289
}
290290

291291
/// Wrapper to read a required (non-optional) TLV record.
292-
pub struct OptionDeserWrapper<T: Readable>(pub Option<T>);
292+
pub struct OptionDeserWrapper<T>(pub Option<T>);
293293
impl<T: Readable> Readable for OptionDeserWrapper<T> {
294294
#[inline]
295295
fn read<R: Read>(reader: &mut R) -> Result<Self, DecodeError> {
296296
Ok(Self(Some(Readable::read(reader)?)))
297297
}
298298
}
299+
impl<A, T: ReadableArgs<A>> ReadableArgs<A> for OptionDeserWrapper<T> {
300+
#[inline]
301+
fn read<R: Read>(reader: &mut R, args: A) -> Result<Self, DecodeError> {
302+
Ok(Self(Some(ReadableArgs::read(reader, args)?)))
303+
}
304+
}
299305
/// When handling `default_values`, we want to map the default-value T directly
300306
/// to a `OptionDeserWrapper<T>` in a way that works for `field: T = t;` as
301307
/// well. Thus, we assume `Into<T> for T` does nothing and use that.
302-
impl<T: Readable> From<T> for OptionDeserWrapper<T> {
308+
impl<T> From<T> for OptionDeserWrapper<T> {
303309
fn from(t: T) -> OptionDeserWrapper<T> { OptionDeserWrapper(Some(t)) }
304310
}
305311

lightning/src/util/ser_macros.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ macro_rules! _encode_tlv {
4848
($stream: expr, $type: expr, $field: expr, (option, encoding: $fieldty: ty)) => {
4949
$crate::_encode_tlv!($stream, $type, $field, option);
5050
};
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+
};
5155
}
5256

5357
/// 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 {
158162
$len.0 += field_len;
159163
}
160164
};
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+
};
161168
($len: expr, $type: expr, $field: expr, ignorable) => {
162169
$crate::_get_varint_length_prefixed_tlv_length!($len, $type, $field, required);
163170
};
@@ -204,6 +211,9 @@ macro_rules! _check_decoded_tlv_order {
204211
return Err(DecodeError::InvalidValue);
205212
}
206213
}};
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+
}};
207217
($last_seen_type: expr, $typ: expr, $type: expr, $field: ident, option) => {{
208218
// no-op
209219
}};
@@ -243,6 +253,9 @@ macro_rules! _check_missing_tlv {
243253
return Err(DecodeError::InvalidValue);
244254
}
245255
}};
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+
}};
246259
($last_seen_type: expr, $type: expr, $field: ident, vec_type) => {{
247260
// no-op
248261
}};
@@ -273,6 +286,9 @@ macro_rules! _decode_tlv {
273286
($reader: expr, $field: ident, required) => {{
274287
$field = $crate::util::ser::Readable::read(&mut $reader)?;
275288
}};
289+
($reader: expr, $field: ident, (required: $trait: ident $(, $read_arg: expr)?)) => {{
290+
$field = $trait::read(&mut $reader $(, $read_arg)*)?;
291+
}};
276292
($reader: expr, $field: ident, vec_type) => {{
277293
let f: $crate::util::ser::WithoutLength<Vec<_>> = $crate::util::ser::Readable::read(&mut $reader)?;
278294
$field = Some(f.0);
@@ -620,6 +636,9 @@ macro_rules! _init_tlv_based_struct_field {
620636
($field: ident, option) => {
621637
$field
622638
};
639+
($field: ident, (option: $trait: ident $(, $read_arg: expr)?)) => {
640+
$crate::_init_tlv_based_struct_field!($field, option)
641+
};
623642
($field: ident, ignorable) => {
624643
if $field.is_none() { return Ok(None); } else { $field.unwrap() }
625644
};
@@ -646,12 +665,18 @@ macro_rules! _init_tlv_field_var {
646665
($field: ident, required) => {
647666
let mut $field = $crate::util::ser::OptionDeserWrapper(None);
648667
};
668+
($field: ident, (required: $trait: ident $(, $read_arg: expr)?)) => {
669+
$crate::_init_tlv_field_var!($field, required);
670+
};
649671
($field: ident, vec_type) => {
650672
let mut $field = Some(Vec::new());
651673
};
652674
($field: ident, option) => {
653675
let mut $field = None;
654676
};
677+
($field: ident, (option: $trait: ident $(, $read_arg: expr)?)) => {
678+
$crate::_init_tlv_field_var!($field, option);
679+
};
655680
($field: ident, ignorable) => {
656681
let mut $field = None;
657682
};

0 commit comments

Comments
 (0)