use std::io::{self, Read};
use iowrap::ReadMany;
const READER_CHUNK_SIZE: usize = 4096;
pub struct ChunkIterator<R> {
reader: R,
chunk_size: usize,
}
impl<R: Read> ChunkIterator<R> {
pub fn new(reader: R) -> Self {
Self {
reader,
chunk_size: READER_CHUNK_SIZE,
}
}
pub const fn chunk_size(&self) -> usize {
self.chunk_size
}
}
impl<R: Read> Iterator for ChunkIterator<R> {
type Item = io::Result<Vec<u8>>;
fn next(&mut self) -> Option<Self::Item> {
let mut buffer = vec![0u8; self.chunk_size];
match self.reader.read_many(&mut buffer) {
Ok(bytes_read) if bytes_read == self.chunk_size => Some(Ok(buffer)),
Ok(0) => None,
Ok(bytes_read) => Some(Ok(buffer[..bytes_read].to_vec())),
Err(error) => Some(Err(error)),
}
}
}