macro_rules! encode_tlv_stream {
    ($stream: expr, {$(($type: expr, $field: expr, $fieldty: tt)),* $(,)*}) => { ... };
}
Expand description

Implements the TLVs serialization part in a Writeable implementation of a struct.

This should be called inside a method which returns Result<_, io::Error>, such as Writeable::write. It will only return an Err if the stream Errs or Writeable::write on one of the fields Errs.

$stream must be a &mut Writer which will receive the bytes for each TLV in the stream.

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.

Any option fields which have a value of None will not be serialized at all.

For example,

let mut required_value = 0u64;
let mut optional_value: Option<u64> = None;
encode_tlv_stream!(stream, {
    (0, required_value, required),
    (1, Some(42u64), option),
    (2, optional_value, option),
});
// At this point `required_value` has been written as a TLV of type 0, `42u64` has been written
// as a TLV of type 1 (indicating the reader may ignore it if it is not understood), and *no*
// TLV is written with type 2.