#[cfg(feature = "progress")]
use indicatif::{ProgressBar, ProgressStyle};
pub trait ProgressReporter: Send + Sync {
fn set_length(&self, len: u64);
fn set_position(&self, pos: u64);
fn set_message(&self, msg: String);
fn finish(&self);
fn finish_with_message(&self, msg: String);
}
pub struct NoOpProgress;
impl ProgressReporter for NoOpProgress {
fn set_length(&self, _len: u64) {}
fn set_position(&self, _pos: u64) {}
fn set_message(&self, _msg: String) {}
fn finish(&self) {}
fn finish_with_message(&self, _msg: String) {}
}
#[cfg(feature = "progress")]
#[derive(Clone)]
pub struct IndicatifProgress {
bar: ProgressBar,
}
#[cfg(feature = "progress")]
impl IndicatifProgress {
pub fn new() -> Self {
let pb = ProgressBar::new(0);
pb.set_style(
ProgressStyle::default_bar()
.template(
"{spinner:.green} [{elapsed_precise}] [{bar:40.cyan/blue}] {pos}/{len} ({percent}%) {msg}",
)
.unwrap()
.progress_chars("#>-"),
);
Self { bar: pb }
}
}
#[cfg(feature = "progress")]
impl Default for IndicatifProgress {
fn default() -> Self {
Self::new()
}
}
#[cfg(feature = "progress")]
impl ProgressReporter for IndicatifProgress {
fn set_length(&self, len: u64) {
self.bar.set_length(len);
}
fn set_position(&self, pos: u64) {
self.bar.set_position(pos);
}
fn set_message(&self, msg: String) {
self.bar.set_message(msg);
}
fn finish(&self) {
self.bar.finish();
}
fn finish_with_message(&self, msg: String) {
self.bar.finish_with_message(msg);
}
}