@@ -241,6 +241,13 @@ pub trait MaybeReadable
241
241
fn read < R : Read > ( reader : & mut R ) -> Result < Option < Self > , DecodeError > ;
242
242
}
243
243
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
+
244
251
pub ( crate ) struct OptionDeserWrapper < T : Readable > ( pub Option < T > ) ;
245
252
impl < T : Readable > Readable for OptionDeserWrapper < T > {
246
253
#[ inline]
@@ -262,15 +269,16 @@ impl<'a, T: Writeable> Writeable for VecWriteWrapper<'a, T> {
262
269
}
263
270
264
271
/// 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 > {
267
274
#[ inline]
268
275
fn read < R : Read > ( mut reader : & mut R ) -> Result < Self , DecodeError > {
269
276
let mut values = Vec :: new ( ) ;
270
277
loop {
271
278
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 ) => { } ,
274
282
// If we failed to read any bytes at all, we reached the end of our TLV
275
283
// stream and have simply exhausted all entries.
276
284
Err ( ref e) if e == & DecodeError :: ShortRead && !track_read. have_read => break ,
@@ -561,7 +569,7 @@ impl Readable for Vec<Signature> {
561
569
return Err ( DecodeError :: BadLengthDescriptor ) ;
562
570
}
563
571
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) ?) ; }
565
573
Ok ( ret)
566
574
}
567
575
}
@@ -726,7 +734,8 @@ impl<T: Writeable> Writeable for Option<T> {
726
734
impl < T : Readable > Readable for Option < T >
727
735
{
728
736
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 {
730
739
0 => Ok ( None ) ,
731
740
len => {
732
741
let mut reader = FixedLengthReader :: new ( r, len - 1 ) ;
0 commit comments