in avro/src/reader.rs [136:170]
fn read_block_next(&mut self) -> AvroResult<()> {
assert!(self.is_empty(), "Expected self to be empty!");
match util::read_long(&mut self.reader) {
Ok(block_len) => {
self.message_count = block_len as usize;
let block_bytes = util::read_long(&mut self.reader)?;
self.fill_buf(block_bytes as usize)?;
let mut marker = [0u8; 16];
self.reader
.read_exact(&mut marker)
.map_err(Error::ReadBlockMarker)?;
if marker != self.marker {
return Err(Error::GetBlockMarker);
}
// NOTE (JAB): This doesn't fit this Reader pattern very well.
// `self.buf` is a growable buffer that is reused as the reader is iterated.
// For non `Codec::Null` variants, `decompress` will allocate a new `Vec`
// and replace `buf` with the new one, instead of reusing the same buffer.
// We can address this by using some "limited read" type to decode directly
// into the buffer. But this is fine, for now.
self.codec.decompress(&mut self.buf)
}
Err(Error::ReadVariableIntegerBytes(io_err)) => {
if let ErrorKind::UnexpectedEof = io_err.kind() {
// to not return any error in case we only finished to read cleanly from the stream
Ok(())
} else {
Err(Error::ReadVariableIntegerBytes(io_err))
}
}
Err(e) => Err(e),
}
}