use std::time::Duration;
use super::{
ProgressCounter,
ProgressEvent,
ProgressPhase,
ProgressSchema,
ProgressStage,
};
#[derive(Debug, Clone, PartialEq)]
pub struct ProgressEventBuilder {
pub(crate) schema: ProgressSchema,
pub(crate) phase: ProgressPhase,
pub(crate) counters: Vec<ProgressCounter>,
pub(crate) stage: Option<ProgressStage>,
pub(crate) elapsed: Duration,
}
impl ProgressEventBuilder {
#[inline]
pub fn new(schema: ProgressSchema) -> Self {
Self {
schema,
phase: ProgressPhase::Running,
counters: Vec::new(),
stage: None,
elapsed: Duration::ZERO,
}
}
#[inline]
#[must_use]
pub const fn phase(mut self, phase: ProgressPhase) -> Self {
self.phase = phase;
self
}
#[inline]
#[must_use]
pub const fn started(self) -> Self {
self.phase(ProgressPhase::Started)
}
#[inline]
#[must_use]
pub const fn running(self) -> Self {
self.phase(ProgressPhase::Running)
}
#[inline]
#[must_use]
pub const fn finished(self) -> Self {
self.phase(ProgressPhase::Finished)
}
#[inline]
#[must_use]
pub const fn failed(self) -> Self {
self.phase(ProgressPhase::Failed)
}
#[inline]
#[must_use]
pub const fn canceled(self) -> Self {
self.phase(ProgressPhase::Canceled)
}
#[inline]
#[must_use]
pub fn counters(mut self, counters: Vec<ProgressCounter>) -> Self {
self.counters = counters;
self
}
#[inline]
#[must_use]
pub fn counter<F>(mut self, metric_id: &str, configure: F) -> Self
where
F: FnOnce(ProgressCounter) -> ProgressCounter,
{
self.counters.push(configure(ProgressCounter::new(metric_id)));
self
}
#[inline]
#[must_use]
pub fn add_counter(mut self, counter: ProgressCounter) -> Self {
self.counters.push(counter);
self
}
#[inline]
#[must_use]
pub fn stage(mut self, stage: ProgressStage) -> Self {
self.stage = Some(stage);
self
}
#[inline]
#[must_use]
pub fn stage_named(self, id: &str, name: &str) -> Self {
self.stage(ProgressStage::new(id, name))
}
#[inline]
#[must_use]
pub const fn elapsed(mut self, elapsed: Duration) -> Self {
self.elapsed = elapsed;
self
}
#[inline]
pub fn build(self) -> ProgressEvent {
ProgressEvent::new(self)
}
}