- $field = Some(ser::Readable::read(&mut s)?);
- if s.bytes_remain() {
- s.eat_remaining()?; // Return ShortRead if there's actually not enough bytes
- Err(DecodeError::InvalidValue)?
+ match $field.lulz_len_read() {
+ Some(len) if len != 0 => {
+ let mut v = [0u8; 9];
+ let bslen = {
+ let mut w = &mut v[..];
+ ser::BigSize(len as u64).write(&mut w).unwrap();
+ 9 - w.len()
+ };
+ assert!(bslen < 9);
+ let mut r = [0; 9];
+ $stream.read_exact(&mut r[0..bslen])?;
+ if r[..bslen] != v[..bslen] {
+ Err(DecodeError::InvalidValue)?
+ }
+ $field = Some(ser::Readable::read($stream)?);
+ },
+ _ => {
+ let length: ser::BigSize = Readable::read($stream)?;
+ let mut s = ser::FixedLengthReader::new($stream, length.0);
+ $field = Some(ser::Readable::read(&mut s)?);
+ if s.bytes_remain() {
+ s.eat_remaining()?; // Return ShortRead if there's actually not enough bytes
+ Err(DecodeError::InvalidValue)?
+ }
+ }