X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Futil%2Fser.rs;h=96936fe95416fd06a1061e323dbbe1952cb09c09;hb=ce4de5fb52246f91d37127594f8fd7d304ab86ad;hp=1b98e341fad6f35e94e555528865ed1cee508b5a;hpb=3c9e8c9d773db3ffaf18bec01bde56e32b871a5f;p=rust-lightning diff --git a/lightning/src/util/ser.rs b/lightning/src/util/ser.rs index 1b98e341..96936fe9 100644 --- a/lightning/src/util/ser.rs +++ b/lightning/src/util/ser.rs @@ -11,7 +11,9 @@ use std::cmp; use secp256k1::Signature; use secp256k1::key::{PublicKey, SecretKey}; use bitcoin::blockdata::script::Script; -use bitcoin::blockdata::transaction::OutPoint; +use bitcoin::blockdata::transaction::{OutPoint, Transaction, TxOut}; +use bitcoin::consensus; +use bitcoin::consensus::Encodable; use bitcoin_hashes::sha256d::Hash as Sha256dHash; use std::marker::Sized; use ln::msgs::DecodeError; @@ -189,6 +191,15 @@ pub trait ReadableArgs fn read(reader: &mut R, params: P) -> Result; } +/// A trait that various rust-lightning types implement allowing them to (maybe) be read in from a Read +pub trait MaybeReadable + where Self: Sized, + R: Read +{ + /// Reads a Self in from the given Read + fn read(reader: &mut R) -> Result, DecodeError>; +} + pub(crate) struct U48(pub u64); impl Writeable for U48 { #[inline] @@ -625,6 +636,33 @@ impl Readable for OutPoint { } } +macro_rules! impl_consensus_ser { + ($bitcoin_type: ty) => { + impl Writeable for $bitcoin_type { + fn write(&self, writer: &mut W) -> Result<(), ::std::io::Error> { + match self.consensus_encode(WriterWriteAdaptor(writer)) { + Ok(_) => Ok(()), + Err(consensus::encode::Error::Io(e)) => Err(e), + Err(_) => panic!("We shouldn't get a consensus::encode::Error unless our Write generated an std::io::Error"), + } + } + } + + impl Readable for $bitcoin_type { + fn read(r: &mut R) -> Result { + match consensus::encode::Decodable::consensus_decode(r) { + Ok(t) => Ok(t), + Err(consensus::encode::Error::Io(ref e)) if e.kind() == ::std::io::ErrorKind::UnexpectedEof => Err(DecodeError::ShortRead), + Err(consensus::encode::Error::Io(e)) => Err(DecodeError::Io(e)), + Err(_) => Err(DecodeError::InvalidValue), + } + } + } + } +} +impl_consensus_ser!(Transaction); +impl_consensus_ser!(TxOut); + impl> Readable for Mutex { fn read(r: &mut R) -> Result { let t: T = Readable::read(r)?;