use crate::TaskEventLevel;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TaskProgressUpdate {
processed: u64,
total: Option<u64>,
level: TaskEventLevel,
label: Option<String>,
}
impl TaskProgressUpdate {
#[must_use]
pub fn new(processed: u64) -> Self {
Self {
processed,
total: None,
level: TaskEventLevel::default(),
label: None,
}
}
#[must_use]
pub fn with_total(mut self, total: Option<u64>) -> Self {
self.total = total;
self
}
#[must_use]
pub fn with_level(mut self, level: TaskEventLevel) -> Self {
self.level = level;
self
}
#[must_use]
pub fn with_label(mut self, label: Option<String>) -> Self {
self.label = label;
self
}
#[must_use]
pub fn processed(&self) -> u64 {
self.processed
}
#[must_use]
pub fn total(&self) -> Option<u64> {
self.total
}
#[must_use]
pub fn level(&self) -> TaskEventLevel {
self.level
}
#[must_use]
pub fn label(&self) -> Option<&str> {
self.label.as_deref()
}
#[must_use]
pub fn into_label(self) -> Option<String> {
self.label
}
}
#[cfg(test)]
mod tests {
use super::TaskProgressUpdate;
use crate::TaskEventLevel;
#[test]
fn builder_defaults_are_bare() {
let update = TaskProgressUpdate::new(7);
assert_eq!(update.processed(), 7);
assert_eq!(update.total(), None);
assert_eq!(update.level(), TaskEventLevel::Info);
assert_eq!(update.label(), None);
}
#[test]
fn consuming_an_update_yields_its_label() {
let update = TaskProgressUpdate::new(1).with_label(Some("hydrate".to_owned()));
assert_eq!(update.into_label().as_deref(), Some("hydrate"));
}
}