X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Futil%2Fser_macros.rs;h=b80ca537bbf03bd86d07912687d32ce81cd11f81;hb=9a5c9b3680dccd45986948c5776bd384b4f89dd7;hp=b229383b283ce1c35e53cf290214a46d2b6e7a2d;hpb=07b674ecb1b92028ba830e8de056d669e50f3752;p=rust-lightning diff --git a/lightning/src/util/ser_macros.rs b/lightning/src/util/ser_macros.rs index b229383b..b80ca537 100644 --- a/lightning/src/util/ser_macros.rs +++ b/lightning/src/util/ser_macros.rs @@ -154,7 +154,8 @@ macro_rules! decode_tlv { $field = ser::Readable::read(&mut $reader)?; }}; ($reader: expr, $field: ident, vec_type) => {{ - $field = Some(ser::Readable::read(&mut $reader)?); + let f: ::util::ser::VecReadWrapper<_> = ser::Readable::read(&mut $reader)?; + $field = Some(f.0); }}; ($reader: expr, $field: ident, option) => {{ $field = Some(ser::Readable::read(&mut $reader)?); @@ -230,6 +231,29 @@ macro_rules! decode_tlv_stream { } } } +macro_rules! impl_writeable_msg { + ($st:ident, {$($field:ident),* $(,)*}, {$(($type: expr, $tlvfield: ident, $fieldty: tt)),* $(,)*}) => { + impl ::util::ser::Writeable for $st { + fn write(&self, w: &mut W) -> Result<(), $crate::io::Error> { + $( self.$field.write(w)?; )* + encode_tlv_stream!(w, {$(($type, self.$tlvfield, $fieldty)),*}); + Ok(()) + } + } + impl ::util::ser::Readable for $st { + fn read(r: &mut R) -> Result { + $(let $field = ::util::ser::Readable::read(r)?;)* + $(init_tlv_field_var!($tlvfield, $fieldty);)* + decode_tlv_stream!(r, {$(($type, $tlvfield, $fieldty)),*}); + Ok(Self { + $($field),*, + $($tlvfield),* + }) + } + } + } +} + macro_rules! impl_writeable { ($st:ident, {$($field:ident),*}) => { impl ::util::ser::Writeable for $st { @@ -325,7 +349,7 @@ macro_rules! init_tlv_based_struct_field { $field.0.unwrap() }; ($field: ident, vec_type) => { - $field.unwrap().0 + $field.unwrap() }; } @@ -337,7 +361,7 @@ macro_rules! init_tlv_field_var { let mut $field = ::util::ser::OptionDeserWrapper(None); }; ($field: ident, vec_type) => { - let mut $field = Some(::util::ser::VecReadWrapper(Vec::new())); + let mut $field = Some(Vec::new()); }; ($field: ident, option) => { let mut $field = None;