use crate::style;
use indicatif::{ProgressBar, ProgressDrawTarget, ProgressStyle};
use std::time::Instant;
pub fn step(msg: impl Into<String>) -> Step {
let msg = msg.into();
eprintln!("{} {msg}", style::arrow());
Step {
msg,
started: Instant::now(),
finished: false,
}
}
pub struct Step {
msg: String,
started: Instant,
finished: bool,
}
impl Step {
pub fn finish(mut self) {
self.finished = true;
let secs = self.started.elapsed().as_secs_f32();
eprintln!("{} {} ({secs:.1}s)", style::ok(), self.msg);
}
}
impl Drop for Step {
fn drop(&mut self) {
if !self.finished {
let secs = self.started.elapsed().as_secs_f32();
eprintln!("{} {} ({secs:.1}s)", style::err(), self.msg);
}
}
}
pub fn xfer_bar(total: u64, label: &str) -> ProgressBar {
let bar = ProgressBar::with_draw_target(Some(total), ProgressDrawTarget::stderr());
bar.set_style(
ProgressStyle::with_template(
" {msg:>12.cyan} [{bar:30.cyan/blue}] {bytes:>10}/{total_bytes:<10} {bytes_per_sec:>12} ETA {eta:>3}",
)
.expect("valid template")
.progress_chars("=>-"),
);
bar.set_message(label.to_string());
bar
}
pub fn spinner(msg: impl Into<String>) -> ProgressBar {
let bar = ProgressBar::with_draw_target(None, ProgressDrawTarget::stderr());
bar.set_style(ProgressStyle::with_template(" {spinner:.cyan} {msg}").expect("valid template"));
bar.set_message(msg.into());
bar.enable_steady_tick(std::time::Duration::from_millis(100));
bar
}