in avro/src/reader.rs [180:209]
fn read_next(&mut self, read_schema: Option<&Schema>) -> AvroResult<Option<Value>> {
if self.is_empty() {
self.read_block_next()?;
if self.is_empty() {
return Ok(None);
}
}
let mut block_bytes = &self.buf[self.buf_idx..];
let b_original = block_bytes.len();
let item = decode_internal(
&self.writer_schema,
&self.names_refs,
&None,
&mut block_bytes,
)?;
let item = match read_schema {
Some(schema) => item.resolve(schema)?,
None => item,
};
if b_original != 0 && b_original == block_bytes.len() {
// from_avro_datum did not consume any bytes, so return an error to avoid an infinite loop
return Err(Error::ReadBlock);
}
self.buf_idx += b_original - block_bytes.len();
self.message_count -= 1;
Ok(Some(item))
}