Add generic serialization implementations for Boxs and 3-tuples

These are used in the next commit(s).
This commit is contained in:
Matt Corallo 2021-05-30 23:47:52 +00:00
parent b385a40e4a
commit 68313da695
2 changed files with 29 additions and 8 deletions

View file

@ -698,6 +698,18 @@ impl Readable for PaymentSecret {
}
}
impl<T: Writeable> Writeable for Box<T> {
fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
T::write(&**self, w)
}
}
impl<T: Readable> Readable for Box<T> {
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
Ok(Box::new(Readable::read(r)?))
}
}
impl<T: Writeable> Writeable for Option<T> {
fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
match *self {
@ -824,3 +836,19 @@ impl<A: Writeable, B: Writeable> Writeable for (A, B) {
self.1.write(w)
}
}
impl<A: Readable, B: Readable, C: Readable> Readable for (A, B, C) {
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
let a: A = Readable::read(r)?;
let b: B = Readable::read(r)?;
let c: C = Readable::read(r)?;
Ok((a, b, c))
}
}
impl<A: Writeable, B: Writeable, C: Writeable> Writeable for (A, B, C) {
fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
self.0.write(w)?;
self.1.write(w)?;
self.2.write(w)
}
}

View file

@ -523,7 +523,7 @@ macro_rules! impl_writeable_tlv_based_enum {
#[cfg(test)]
mod tests {
use prelude::*;
use std::io::{Cursor, Read};
use std::io::Cursor;
use ln::msgs::DecodeError;
use util::ser::{Readable, Writeable, HighZeroBytesDroppedVarInt, VecWriter};
use bitcoin::secp256k1::PublicKey;
@ -593,13 +593,6 @@ mod tests {
(0xdeadbeef1badbeef, 0x1bad1dea, Some(0x01020304)));
}
impl Readable for (PublicKey, u64, u64) {
#[inline]
fn read<R: Read>(reader: &mut R) -> Result<(PublicKey, u64, u64), DecodeError> {
Ok((Readable::read(reader)?, Readable::read(reader)?, Readable::read(reader)?))
}
}
// BOLT TLV test cases
fn tlv_reader_n1(s: &[u8]) -> Result<(Option<HighZeroBytesDroppedVarInt<u64>>, Option<u64>, Option<(PublicKey, u64, u64)>, Option<u16>), DecodeError> {
let mut s = Cursor::new(s);