use super::regression_sinking::write_checkpoint;
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct StreamingProgress {
pub tested: u64,
pub passed: u64,
pub failed: u64,
pub current_op: String,
}
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct StreamingSummary {
pub tested: u64,
pub passed: u64,
pub failed: u64,
}
pub trait ProgressSink: Send {
fn on_progress(&mut self, progress: StreamingProgress);
}
#[derive(Clone, Default)]
pub struct NoProgress;
impl ProgressSink for NoProgress {
fn on_progress(&mut self, _: StreamingProgress) {}
}
pub struct FnProgress<F>(pub F);
impl<F: FnMut(StreamingProgress) + Send + 'static> ProgressSink for FnProgress<F> {
fn on_progress(&mut self, progress: StreamingProgress) {
self.0(progress);
}
}
#[inline]
pub(crate) fn report_progress<P: ProgressSink>(
sink: &mut P,
summary: &StreamingSummary,
current_op: &str,
next_test_id: u64,
progress_interval: u64,
checkpoint_interval: u64,
shard_id: u64,
shard_count: u64,
) {
let should_report =
summary.tested == 0 || summary.tested % progress_interval == 0 || summary.failed > 0;
if should_report {
sink.on_progress(StreamingProgress {
tested: summary.tested,
passed: summary.passed,
failed: summary.failed,
current_op: current_op.to_string(),
});
}
if checkpoint_interval > 0 && summary.tested > 0 && summary.tested % checkpoint_interval == 0 {
let _ = write_checkpoint(shard_id, next_test_id, shard_count);
}
}