X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=src%2Futil%2Fser.rs;h=92cc66b81e30af9599f35bcd8cec1bcb088d2713;hb=e397cb99601e9d2849bbc3aad2b0df8bc8b7f522;hp=18aa7eee9da8ced1b7e23cf48742fa3cd23736d2;hpb=8322c756cb3574d74cf1b88893dad14ec5be57ad;p=rust-lightning diff --git a/src/util/ser.rs b/src/util/ser.rs index 18aa7eee..92cc66b8 100644 --- a/src/util/ser.rs +++ b/src/util/ser.rs @@ -1,3 +1,6 @@ +//! A very simple serialization framework which is used to serialize/deserialize messages as well +//! as ChannelsManagers and ChannelMonitors. + use std::result::Result; use std::io::Read; use std::collections::HashMap; @@ -9,6 +12,7 @@ use bitcoin::util::hash::Sha256dHash; use bitcoin::blockdata::script::Script; use std::marker::Sized; use ln::msgs::DecodeError; +use util::byte_utils; use util::byte_utils::{be64_to_array, be32_to_array, be16_to_array, slice_to_be16, slice_to_be32, slice_to_be64}; @@ -35,10 +39,38 @@ impl Writer for W { fn size_hint(&mut self, _size: usize) { } } +struct VecWriter(Vec); +impl Writer for VecWriter { + fn write_all(&mut self, buf: &[u8]) -> Result<(), ::std::io::Error> { + self.0.extend_from_slice(buf); + Ok(()) + } + fn size_hint(&mut self, size: usize) { + self.0.reserve_exact(size); + } +} + /// A trait that various rust-lightning types implement allowing them to be written out to a Writer -pub trait Writeable { +pub trait Writeable { /// Writes self out to the given Writer - fn write(&self, writer: &mut W) -> Result<(), ::std::io::Error>; + fn write(&self, writer: &mut W) -> Result<(), ::std::io::Error>; + + /// Writes self out to a Vec + fn encode(&self) -> Vec { + let mut msg = VecWriter(Vec::new()); + self.write(&mut msg).unwrap(); + msg.0 + } + + /// Writes self out to a Vec + fn encode_with_len(&self) -> Vec { + let mut msg = VecWriter(Vec::new()); + 0u16.write(&mut msg).unwrap(); + self.write(&mut msg).unwrap(); + let len = msg.0.len(); + msg.0[..2].copy_from_slice(&byte_utils::be16_to_array(len as u16 - 2)); + msg.0 + } } /// A trait that various rust-lightning types implement allowing them to be read in from a Read @@ -52,9 +84,9 @@ pub trait Readable macro_rules! impl_writeable_primitive { ($val_type:ty, $meth_write:ident, $len: expr, $meth_read:ident) => { - impl Writeable for $val_type { + impl Writeable for $val_type { #[inline] - fn write(&self, writer: &mut W) -> Result<(), ::std::io::Error> { + fn write(&self, writer: &mut W) -> Result<(), ::std::io::Error> { writer.write_all(&$meth_write(*self)) } } @@ -73,9 +105,9 @@ impl_writeable_primitive!(u64, be64_to_array, 8, slice_to_be64); impl_writeable_primitive!(u32, be32_to_array, 4, slice_to_be32); impl_writeable_primitive!(u16, be16_to_array, 2, slice_to_be16); -impl Writeable for u8 { +impl Writeable for u8 { #[inline] - fn write(&self, writer: &mut W) -> Result<(), ::std::io::Error> { + fn write(&self, writer: &mut W) -> Result<(), ::std::io::Error> { writer.write_all(&[*self]) } } @@ -88,9 +120,9 @@ impl Readable for u8 { } } -impl Writeable for bool { +impl Writeable for bool { #[inline] - fn write(&self, writer: &mut W) -> Result<(), ::std::io::Error> { + fn write(&self, writer: &mut W) -> Result<(), ::std::io::Error> { writer.write_all(&[if *self {1} else {0}]) } } @@ -109,10 +141,10 @@ impl Readable for bool { // u8 arrays macro_rules! impl_array { ( $size:expr ) => ( - impl Writeable for [u8; $size] + impl Writeable for [u8; $size] { #[inline] - fn write(&self, w: &mut W) -> Result<(), ::std::io::Error> { + fn write(&self, w: &mut W) -> Result<(), ::std::io::Error> { w.write_all(self) } } @@ -136,13 +168,12 @@ impl_array!(64); // for Signature impl_array!(1300); // for OnionPacket.hop_data // HashMap -impl Writeable for HashMap - where W: Writer, - K: Writeable + Eq + Hash, - V: Writeable +impl Writeable for HashMap + where K: Writeable + Eq + Hash, + V: Writeable { #[inline] - fn write(&self, w: &mut W) -> Result<(), ::std::io::Error> { + fn write(&self, w: &mut W) -> Result<(), ::std::io::Error> { (self.len() as u16).write(w)?; for (key, value) in self.iter() { key.write(w)?; @@ -169,9 +200,9 @@ impl Readable for HashMap } // Vectors -impl Writeable for Vec { +impl Writeable for Vec { #[inline] - fn write(&self, w: &mut W) -> Result<(), ::std::io::Error> { + fn write(&self, w: &mut W) -> Result<(), ::std::io::Error> { (self.len() as u16).write(w)?; w.write_all(&self) } @@ -187,9 +218,9 @@ impl Readable for Vec { Ok(ret) } } -impl Writeable for Vec { +impl Writeable for Vec { #[inline] - fn write(&self, w: &mut W) -> Result<(), ::std::io::Error> { + fn write(&self, w: &mut W) -> Result<(), ::std::io::Error> { (self.len() as u16).write(w)?; for e in self.iter() { e.write(w)?; @@ -214,8 +245,8 @@ impl Readable for Vec { } } -impl Writeable for Script { - fn write(&self, w: &mut W) -> Result<(), ::std::io::Error> { +impl Writeable for Script { + fn write(&self, w: &mut W) -> Result<(), ::std::io::Error> { (self.len() as u16).write(w)?; w.write_all(self.as_bytes()) } @@ -230,8 +261,8 @@ impl Readable for Script { } } -impl Writeable for Option