use std::sync::Arc;
use log::info;
#[derive(Debug, Clone)]
pub struct Progress(Arc<dyn RusticProgress>);
impl Progress {
pub fn new<P: RusticProgress>(p: P) -> Self {
Self(Arc::new(p))
}
#[must_use]
pub fn hidden() -> Self {
Self(Arc::new(HiddenProgress))
}
#[must_use]
pub fn is_hidden(&self) -> bool {
self.0.is_hidden()
}
pub fn set_length(&self, len: u64) {
self.0.set_length(len);
}
pub fn set_title(&self, title: &str) {
self.0.set_title(title);
}
pub fn inc(&self, inc: u64) {
self.0.inc(inc);
}
pub fn finish(&self) {
self.0.finish();
}
}
pub trait RusticProgress: Send + Sync + 'static + std::fmt::Debug {
fn is_hidden(&self) -> bool;
fn set_length(&self, len: u64);
fn set_title(&self, title: &str);
fn inc(&self, inc: u64);
fn finish(&self);
}
#[derive(Debug, Clone, Copy)]
pub enum ProgressType {
Spinner,
Counter,
Bytes,
}
pub trait ProgressBars: std::fmt::Debug + Send + Sync + 'static {
fn progress(&self, progress_type: ProgressType, prefix: &str) -> Progress;
}
#[derive(Clone, Copy, Debug)]
pub struct HiddenProgress;
impl RusticProgress for HiddenProgress {
fn is_hidden(&self) -> bool {
true
}
fn set_length(&self, _len: u64) {}
fn set_title(&self, _title: &str) {}
fn inc(&self, _inc: u64) {}
fn finish(&self) {}
}
#[derive(Clone, Copy, Debug)]
pub struct NoProgress;
impl RusticProgress for NoProgress {
fn is_hidden(&self) -> bool {
true
}
fn set_length(&self, _len: u64) {}
fn set_title(&self, title: &str) {
info!("{title}");
}
fn inc(&self, _inc: u64) {}
fn finish(&self) {
info!("finished.");
}
}
#[derive(Clone, Copy, Debug)]
pub struct NoProgressBars;
impl ProgressBars for NoProgressBars {
fn progress(&self, _progress_type: ProgressType, prefix: &str) -> Progress {
info!("{prefix}");
Progress::new(NoProgress)
}
}