mago_feedback/
progress.rsuse std::sync::LazyLock;
use indicatif::MultiProgress;
use indicatif::ProgressBar;
use indicatif::ProgressStyle;
pub static GLOBAL_PROGRESS_MANAGER: LazyLock<MultiProgress> = LazyLock::new(MultiProgress::new);
pub fn create_progress_bar(length: usize, prefix: &'static str, theme: ProgressBarTheme) -> ProgressBar {
let pb = GLOBAL_PROGRESS_MANAGER.add(ProgressBar::new(length as u64));
pb.set_style(
ProgressStyle::with_template(theme.template())
.unwrap()
.progress_chars(theme.progress_chars())
.tick_chars(theme.tick_chars()),
);
pb.set_prefix(prefix);
pb
}
pub fn remove_progress_bar(progress_bar: ProgressBar) {
progress_bar.finish_and_clear();
GLOBAL_PROGRESS_MANAGER.remove(&progress_bar);
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum ProgressBarTheme {
Red,
Yellow,
Green,
Blue,
Magenta,
Cyan,
}
impl ProgressBarTheme {
pub fn template(&self) -> &'static str {
match self {
Self::Red => "{spinner} {prefix:<16.bold}▕{wide_bar:.red}▏{pos:>6}/{len}▕ {percent:>3}%▕ ETA: {eta_precise}▕ Elapsed: {elapsed_precise}",
Self::Yellow => "{spinner} {prefix:<16.bold}▕{wide_bar:.yellow}▏{pos:>6}/{len}▕ {percent:>3}%▕ ETA: {eta_precise}▕ Elapsed: {elapsed_precise}",
Self::Green => "{spinner} {prefix:<16.bold}▕{wide_bar:.green}▏{pos:>6}/{len}▕ {percent:>3}%▕ ETA: {eta_precise}▕ Elapsed: {elapsed_precise}",
Self::Blue => "{spinner} {prefix:<16.bold}▕{wide_bar:.blue}▏{pos:>6}/{len}▕ {percent:>3}%▕ ETA: {eta_precise}▕ Elapsed: {elapsed_precise}",
Self::Magenta => "{spinner} {prefix:<16.bold}▕{wide_bar:.magenta}▏{pos:>6}/{len}▕ {percent:>3}%▕ ETA: {eta_precise}▕ Elapsed: {elapsed_precise}",
Self::Cyan => "{spinner} {prefix:<16.bold}▕{wide_bar:.cyan}▏{pos:>6}/{len}▕ {percent:>3}%▕ ETA: {eta_precise}▕ Elapsed: {elapsed_precise}",
}
}
pub fn progress_chars(&self) -> &'static str {
match self {
ProgressBarTheme::Red => "█░ ",
ProgressBarTheme::Yellow => "█▉▊▋▌▍▎▏░ ",
ProgressBarTheme::Green => "█▇▆▅▄▃▂▁░ ",
ProgressBarTheme::Blue => "█▓▒░░ ",
ProgressBarTheme::Magenta => "█▛▌▖░ ",
ProgressBarTheme::Cyan => "█▉▊▋▌▍▎▏░ ",
}
}
pub fn tick_chars(&self) -> &'static str {
match self {
ProgressBarTheme::Red => "⠁⠂⠄⡀⢀⠠⠐⠈ ",
ProgressBarTheme::Yellow => "⢀⠠⠐⠈⠁⠂⠄⡀ ",
ProgressBarTheme::Green => "⠄⡀⢀⠠⠐⠈⠁⠂ ",
ProgressBarTheme::Blue => "⡀⢀⠠⠐⠈⠁⠂⠄ ",
ProgressBarTheme::Magenta => "⠐⠈⠁⠂⠄⡀⢀⠠ ",
ProgressBarTheme::Cyan => "⠠⠐⠈⠁⠂⠄⡀⢀ ",
}
}
}