use crate::{blocks::Message, parser::ExailParser};
use std::io::Read;
const BUFFER_SIZE: usize = 1024 * 8;
pub struct ExailReader<R: Read> {
reader: R,
parser: ExailParser,
drain_internal: bool,
}
impl<R: Read> ExailReader<R> {
pub fn new(reader: R) -> Self {
Self {
reader,
parser: ExailParser::new(),
drain_internal: false,
}
}
}
impl<R: Read> Iterator for ExailReader<R> {
type Item = Result<Message, std::io::Error>;
fn next(&mut self) -> Option<Self::Item> {
let mut buffer = [0u8; BUFFER_SIZE];
loop {
let (bytes_read, is_eof) = if self.drain_internal {
(0, false)
} else {
match self.reader.read(&mut buffer) {
Ok(br) => (br, br == 0),
Err(e) => return Some(Err(e)),
}
};
match self.parser.consume(&buffer[..bytes_read]) {
Some(message) => {
self.drain_internal = true;
return Some(Ok(message));
}
None => {
self.drain_internal = false;
}
}
if is_eof {
return None;
}
}
}
}