use log::error;
use crate::error::BatchError;
#[derive(Debug)]
pub enum ChunkStatus {
CONTINUABLE,
FINISHED,
COMPLETE,
}
pub struct Chunk<R> {
items: Vec<R>,
status: ChunkStatus,
chunk_size: usize,
}
impl<R> Chunk<R> {
pub fn new(chunk_size: usize) -> Chunk<R> {
Chunk {
items: Vec::with_capacity(chunk_size),
status: ChunkStatus::CONTINUABLE,
chunk_size,
}
}
pub fn add_item(&mut self, read_item: Option<Result<R, BatchError>>) {
if let Some(result) = read_item {
match result {
Ok(item) => {
self.items.push(item);
}
Err(err) => {
error!("Error occured: {}", err)
}
};
} else {
self.status = ChunkStatus::FINISHED;
}
if self.items.len() == self.chunk_size {
self.status = ChunkStatus::COMPLETE;
}
}
pub fn get_items(&self) -> &Vec<R> {
&self.items
}
pub fn get_status(&self) -> &ChunkStatus {
&self.status
}
pub fn clear(&mut self) {
self.status = ChunkStatus::CONTINUABLE;
self.items = Vec::with_capacity(self.chunk_size);
}
}