use std::time::Duration;
use crate::{
BatchProcessResult,
BatchProcessResultBuildError,
};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BatchProcessResultBuilder {
pub(crate) item_count: usize,
pub(crate) completed_count: usize,
pub(crate) processed_count: usize,
pub(crate) chunk_count: usize,
pub(crate) elapsed: Duration,
}
impl BatchProcessResultBuilder {
#[inline]
pub const fn builder(item_count: usize) -> Self {
Self {
item_count,
completed_count: 0,
processed_count: 0,
chunk_count: 0,
elapsed: Duration::ZERO,
}
}
#[inline]
pub const fn completed_count(mut self, completed_count: usize) -> Self {
self.completed_count = completed_count;
self
}
#[inline]
pub const fn processed_count(mut self, processed_count: usize) -> Self {
self.processed_count = processed_count;
self
}
#[inline]
pub const fn chunk_count(mut self, chunk_count: usize) -> Self {
self.chunk_count = chunk_count;
self
}
#[inline]
pub const fn elapsed(mut self, elapsed: Duration) -> Self {
self.elapsed = elapsed;
self
}
#[inline]
pub fn validate(self) -> Result<Self, BatchProcessResultBuildError> {
validate_process_result_invariants(
self.item_count,
self.completed_count,
self.processed_count,
self.chunk_count,
)?;
Ok(self)
}
#[inline]
pub fn build(self) -> Result<BatchProcessResult, BatchProcessResultBuildError> {
self.validate().map(BatchProcessResult::new)
}
}
fn validate_process_result_invariants(
item_count: usize,
completed_count: usize,
processed_count: usize,
chunk_count: usize,
) -> Result<(), BatchProcessResultBuildError> {
if completed_count > item_count {
return Err(BatchProcessResultBuildError::CompletedCountExceeded {
item_count,
completed_count,
});
}
if processed_count > completed_count {
return Err(BatchProcessResultBuildError::ProcessedCountExceeded {
completed_count,
processed_count,
});
}
if completed_count > 0 && chunk_count == 0 {
return Err(
BatchProcessResultBuildError::MissingChunkForCompletedItems { completed_count },
);
}
if chunk_count > completed_count {
return Err(BatchProcessResultBuildError::ChunkCountExceeded {
completed_count,
chunk_count,
});
}
Ok(())
}