Skip to content

Commit 9efaf66

Browse files
committed
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.
1 parent a369f9e commit 9efaf66

File tree

3 files changed

+18
-8
lines changed

3 files changed

+18
-8
lines changed

lightning/src/ln/channelmanager.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1478,7 +1478,8 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
14781478
let mut chacha = ChaCha20::new(&rho, &[0u8; 8]);
14791479
let mut chacha_stream = ChaChaReader { chacha: &mut chacha, read: Cursor::new(&msg.onion_routing_packet.hop_data[..]) };
14801480
let (next_hop_data, next_hop_hmac) = {
1481-
match msgs::OnionHopData::read(&mut chacha_stream) {
1481+
let ohd: Result<msgs::OnionHopData, _> = Readable::read(&mut chacha_stream);
1482+
match ohd {
14821483
Err(err) => {
14831484
let error_code = match err {
14841485
msgs::DecodeError::UnknownVersion => 0x4000 | 1, // unknown realm byte

lightning/src/util/ser.rs

+15-6
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,13 @@ pub trait MaybeReadable
241241
fn read<R: Read>(reader: &mut R) -> Result<Option<Self>, DecodeError>;
242242
}
243243

244+
impl<T: Readable> MaybeReadable for T {
245+
#[inline]
246+
fn read<R: Read>(reader: &mut R) -> Result<Option<T>, DecodeError> {
247+
Ok(Some(Readable::read(reader)?))
248+
}
249+
}
250+
244251
pub(crate) struct OptionDeserWrapper<T: Readable>(pub Option<T>);
245252
impl<T: Readable> Readable for OptionDeserWrapper<T> {
246253
#[inline]
@@ -262,15 +269,16 @@ impl<'a, T: Writeable> Writeable for VecWriteWrapper<'a, T> {
262269
}
263270

264271
/// Wrapper to read elements from a given stream until it reaches the end of the stream.
265-
pub(crate) struct VecReadWrapper<T: Readable>(pub Vec<T>);
266-
impl<T: Readable> Readable for VecReadWrapper<T> {
272+
pub(crate) struct VecReadWrapper<T>(pub Vec<T>);
273+
impl<T: MaybeReadable> Readable for VecReadWrapper<T> {
267274
#[inline]
268275
fn read<R: Read>(mut reader: &mut R) -> Result<Self, DecodeError> {
269276
let mut values = Vec::new();
270277
loop {
271278
let mut track_read = ReadTrackingReader::new(&mut reader);
272-
match Readable::read(&mut track_read) {
273-
Ok(v) => { values.push(v); },
279+
match MaybeReadable::read(&mut track_read) {
280+
Ok(Some(v)) => { values.push(v); },
281+
Ok(None) => { },
274282
// If we failed to read any bytes at all, we reached the end of our TLV
275283
// stream and have simply exhausted all entries.
276284
Err(ref e) if e == &DecodeError::ShortRead && !track_read.have_read => break,
@@ -561,7 +569,7 @@ impl Readable for Vec<Signature> {
561569
return Err(DecodeError::BadLengthDescriptor);
562570
}
563571
let mut ret = Vec::with_capacity(len as usize);
564-
for _ in 0..len { ret.push(Signature::read(r)?); }
572+
for _ in 0..len { ret.push(Readable::read(r)?); }
565573
Ok(ret)
566574
}
567575
}
@@ -726,7 +734,8 @@ impl<T: Writeable> Writeable for Option<T> {
726734
impl<T: Readable> Readable for Option<T>
727735
{
728736
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
729-
match BigSize::read(r)?.0 {
737+
let len: BigSize = Readable::read(r)?;
738+
match len.0 {
730739
0 => Ok(None),
731740
len => {
732741
let mut reader = FixedLengthReader::new(r, len - 1);

lightning/src/util/ser_macros.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ macro_rules! read_ver_prefix {
371371
/// Reads a suffix added by write_tlv_fields.
372372
macro_rules! read_tlv_fields {
373373
($stream: expr, {$(($type: expr, $field: ident, $fieldty: tt)),* $(,)*}) => { {
374-
let tlv_len = ::util::ser::BigSize::read($stream)?;
374+
let tlv_len: ::util::ser::BigSize = ::util::ser::Readable::read($stream)?;
375375
let mut rd = ::util::ser::FixedLengthReader::new($stream, tlv_len.0);
376376
decode_tlv_stream!(&mut rd, {$(($type, $field, $fieldty)),*});
377377
rd.eat_remaining().map_err(|_| ::ln::msgs::DecodeError::ShortRead)?;

0 commit comments

Comments
 (0)