#[cfg(feature = "progress")]
use indicatif::{ProgressBar, ProgressStyle};
pub struct Progress {
#[cfg(feature = "progress")]
inner: ProgressBar,
}
impl Progress {
#[must_use]
pub fn new(len: usize, prefix: &'static str) -> Self {
log::info!("{prefix}: {len} files");
Self {
#[cfg(feature = "progress")]
inner: make_indicatif(len, prefix),
}
}
#[inline]
pub fn inc(&self, n: u64) {
#[cfg(feature = "progress")]
self.inner.inc(n);
#[cfg(not(feature = "progress"))]
let _ = n;
}
#[inline]
pub fn finish_and_clear(&self) {
#[cfg(feature = "progress")]
self.inner.finish_and_clear();
}
}
#[cfg(feature = "progress")]
fn make_indicatif(len: usize, prefix: &'static str) -> ProgressBar {
let pb = ProgressBar::new(len as u64);
pb.set_style(
ProgressStyle::with_template(
"{prefix:.bold} {bar:40.cyan/blue} {pos}/{len} {spinner} [{elapsed_precise}]",
)
.expect("valid indicatif template")
.progress_chars("#>-"),
);
pb.set_prefix(prefix);
pb.enable_steady_tick(std::time::Duration::from_millis(200));
pb
}