macro_rules! decode_tlv_stream { ($stream: expr, {$(($type: expr, $field: ident, $fieldty: tt)),* $(,)*}) => { ... }; }
Expand description
Implements the TLVs deserialization part in a Readable
implementation of a struct.
This should be called inside a method which returns Result<_,
DecodeError
>
, such as
Readable::read
. It will either return an Err
or ensure all required
fields have been
read and optionally read optional
fields.
$stream
must be a Read
and will be fully consumed, reading until no more bytes remain
(i.e. it returns DecodeError::ShortRead
).
Fields MUST be sorted in $type
-order.
Note that the lightning TLV requirements require that a single type not appear more than once, that TLVs are sorted in type-ascending order, and that any even types be understood by the decoder.
For example,
let mut required_value = 0u64;
let mut optional_value: Option<u64> = None;
decode_tlv_stream!(stream, {
(0, required_value, required),
(2, optional_value, option),
});
// At this point, `required_value` has been overwritten with the TLV with type 0.
// `optional_value` may have been overwritten, setting it to `Some` if a TLV with type 2 was
// present.