mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-02-24 23:08:36 +01:00
Implement VecReadWrapper
for MaybeReadable
This makes it much simpler to deal with `MaybeReadable` types in `Vec`s in TLVs as we can transparently deal with them as `vec`, with the wrapper doing the Right Thing. This requires we implement `MaybeReadable` for all `Readable` which has some downstream implications, but nothing too bad.
This commit is contained in:
parent
a369f9e64e
commit
45490d537e
3 changed files with 18 additions and 9 deletions
|
@ -1477,8 +1477,8 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
|||
|
||||
let mut chacha = ChaCha20::new(&rho, &[0u8; 8]);
|
||||
let mut chacha_stream = ChaChaReader { chacha: &mut chacha, read: Cursor::new(&msg.onion_routing_packet.hop_data[..]) };
|
||||
let (next_hop_data, next_hop_hmac) = {
|
||||
match msgs::OnionHopData::read(&mut chacha_stream) {
|
||||
let (next_hop_data, next_hop_hmac): (msgs::OnionHopData, _) = {
|
||||
match <msgs::OnionHopData as Readable>::read(&mut chacha_stream) {
|
||||
Err(err) => {
|
||||
let error_code = match err {
|
||||
msgs::DecodeError::UnknownVersion => 0x4000 | 1, // unknown realm byte
|
||||
|
|
|
@ -241,6 +241,13 @@ pub trait MaybeReadable
|
|||
fn read<R: Read>(reader: &mut R) -> Result<Option<Self>, DecodeError>;
|
||||
}
|
||||
|
||||
impl<T: Readable> MaybeReadable for T {
|
||||
#[inline]
|
||||
fn read<R: Read>(reader: &mut R) -> Result<Option<T>, DecodeError> {
|
||||
Ok(Some(Readable::read(reader)?))
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) struct OptionDeserWrapper<T: Readable>(pub Option<T>);
|
||||
impl<T: Readable> Readable for OptionDeserWrapper<T> {
|
||||
#[inline]
|
||||
|
@ -262,15 +269,16 @@ impl<'a, T: Writeable> Writeable for VecWriteWrapper<'a, T> {
|
|||
}
|
||||
|
||||
/// Wrapper to read elements from a given stream until it reaches the end of the stream.
|
||||
pub(crate) struct VecReadWrapper<T: Readable>(pub Vec<T>);
|
||||
impl<T: Readable> Readable for VecReadWrapper<T> {
|
||||
pub(crate) struct VecReadWrapper<T>(pub Vec<T>);
|
||||
impl<T: MaybeReadable> Readable for VecReadWrapper<T> {
|
||||
#[inline]
|
||||
fn read<R: Read>(mut reader: &mut R) -> Result<Self, DecodeError> {
|
||||
let mut values = Vec::new();
|
||||
loop {
|
||||
let mut track_read = ReadTrackingReader::new(&mut reader);
|
||||
match Readable::read(&mut track_read) {
|
||||
Ok(v) => { values.push(v); },
|
||||
match MaybeReadable::read(&mut track_read) {
|
||||
Ok(Some(v)) => { values.push(v); },
|
||||
Ok(None) => { },
|
||||
// If we failed to read any bytes at all, we reached the end of our TLV
|
||||
// stream and have simply exhausted all entries.
|
||||
Err(ref e) if e == &DecodeError::ShortRead && !track_read.have_read => break,
|
||||
|
@ -561,7 +569,7 @@ impl Readable for Vec<Signature> {
|
|||
return Err(DecodeError::BadLengthDescriptor);
|
||||
}
|
||||
let mut ret = Vec::with_capacity(len as usize);
|
||||
for _ in 0..len { ret.push(Signature::read(r)?); }
|
||||
for _ in 0..len { ret.push(Readable::read(r)?); }
|
||||
Ok(ret)
|
||||
}
|
||||
}
|
||||
|
@ -726,7 +734,8 @@ impl<T: Writeable> Writeable for Option<T> {
|
|||
impl<T: Readable> Readable for Option<T>
|
||||
{
|
||||
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
|
||||
match BigSize::read(r)?.0 {
|
||||
let len: BigSize = Readable::read(r)?;
|
||||
match len.0 {
|
||||
0 => Ok(None),
|
||||
len => {
|
||||
let mut reader = FixedLengthReader::new(r, len - 1);
|
||||
|
|
|
@ -371,7 +371,7 @@ macro_rules! read_ver_prefix {
|
|||
/// Reads a suffix added by write_tlv_fields.
|
||||
macro_rules! read_tlv_fields {
|
||||
($stream: expr, {$(($type: expr, $field: ident, $fieldty: tt)),* $(,)*}) => { {
|
||||
let tlv_len = ::util::ser::BigSize::read($stream)?;
|
||||
let tlv_len: ::util::ser::BigSize = ::util::ser::Readable::read($stream)?;
|
||||
let mut rd = ::util::ser::FixedLengthReader::new($stream, tlv_len.0);
|
||||
decode_tlv_stream!(&mut rd, {$(($type, $field, $fieldty)),*});
|
||||
rd.eat_remaining().map_err(|_| ::ln::msgs::DecodeError::ShortRead)?;
|
||||
|
|
Loading…
Add table
Reference in a new issue