Merge pull request #225 from TheBlueMatt/2018-10-214-redo
[rust-lightning] / src / util / ser_macros.rs
index 619d8e2f782595f0c1b76927fffc7dcb76ca9e23..09a319fb45951a043106f9ae6d7fe4d13b94779b 100644 (file)
@@ -1,14 +1,36 @@
 macro_rules! impl_writeable {
-       ($st:ident, {$($field:ident),*}) => {
-               impl<W: ::std::io::Write> Writeable<W> for $st {
-                       fn write(&self, w: &mut Writer<W>) -> Result<(), DecodeError> {
+       ($st:ident, $len: expr, {$($field:ident),*}) => {
+               impl Writeable for $st {
+                       fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
+                               w.size_hint($len);
                                $( self.$field.write(w)?; )*
                                Ok(())
                        }
                }
 
-               impl<R: ::std::io::Read> Readable<R> for $st {
-                       fn read(r: &mut Reader<R>) -> Result<Self, DecodeError> {
+               impl<R: Read> Readable<R> for $st {
+                       fn read(r: &mut R) -> Result<Self, DecodeError> {
+                               Ok(Self {
+                                       $($field: Readable::read(r)?),*
+                               })
+                       }
+               }
+       }
+}
+macro_rules! impl_writeable_len_match {
+       ($st:ident, {$({$m: pat, $l: expr}),*}, {$($field:ident),*}) => {
+               impl Writeable for $st {
+                       fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
+                               w.size_hint(match *self {
+                                       $($m => $l,)*
+                               });
+                               $( self.$field.write(w)?; )*
+                               Ok(())
+                       }
+               }
+
+               impl<R: Read> Readable<R> for $st {
+                       fn read(r: &mut R) -> Result<Self, DecodeError> {
                                Ok(Self {
                                        $($field: Readable::read(r)?),*
                                })