use crate::cli::ExecContext;
use indicatif::{ProgressBar, ProgressStyle};
use std::time::Duration;
const SPINNER_TEMPLATE: &str = "{spinner:.cyan} {msg}";
const BAR_TEMPLATE: &str = "{spinner:.cyan} [{bar:30.cyan/dim}] {pos}/{len} {msg}";
const TICK_INTERVAL_MS: u64 = 80;
pub fn create_spinner(ctx: &ExecContext, message: impl Into<String>) -> Option<ProgressBar> {
let mp = ctx.progress.as_ref()?;
let pb = mp.add(ProgressBar::new_spinner());
pb.set_style(
ProgressStyle::default_spinner()
.template(SPINNER_TEMPLATE)
.expect("valid template")
.tick_chars("⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏"),
);
pb.set_message(message.into());
pb.enable_steady_tick(Duration::from_millis(TICK_INTERVAL_MS));
Some(pb)
}
pub fn create_bar(ctx: &ExecContext, len: u64, message: impl Into<String>) -> Option<ProgressBar> {
let mp = ctx.progress.as_ref()?;
let pb = mp.add(ProgressBar::new(len));
pb.set_style(
ProgressStyle::default_bar()
.template(BAR_TEMPLATE)
.expect("valid template")
.progress_chars("=> "),
);
pb.set_message(message.into());
pb.enable_steady_tick(Duration::from_millis(TICK_INTERVAL_MS));
Some(pb)
}
pub fn finish_success(pb: Option<ProgressBar>, message: impl Into<String>) {
if let Some(pb) = pb {
pb.set_style(
ProgressStyle::default_spinner()
.template("{msg}")
.expect("valid template"),
);
pb.finish_with_message(format!("\u{2714} {}", message.into()));
}
}
pub fn finish_error(pb: Option<ProgressBar>, message: impl Into<String>) {
if let Some(pb) = pb {
pb.set_style(
ProgressStyle::default_spinner()
.template("{msg}")
.expect("valid template"),
);
pb.finish_with_message(format!("\u{2718} {}", message.into()));
}
}
pub fn finish_warning(pb: Option<ProgressBar>, message: impl Into<String>) {
if let Some(pb) = pb {
pb.set_style(
ProgressStyle::default_spinner()
.template("{msg}")
.expect("valid template"),
);
pb.finish_with_message(format!("\u{26A0} {}", message.into()));
}
}
pub fn set_message(pb: &Option<ProgressBar>, message: impl Into<String>) {
if let Some(pb) = pb {
pb.set_message(message.into());
}
}
pub fn inc(pb: &Option<ProgressBar>) {
if let Some(pb) = pb {
pb.inc(1);
}
}