Files
pkh/src/ui.rs

36 lines
1.2 KiB
Rust

use std::time::Duration;
use indicatif::{MultiProgress, ProgressBar, ProgressStyle};
pub fn create_progress_bar(multi: &MultiProgress) -> (ProgressBar, impl Fn(&str, &str, usize, usize) + '_) {
let pb = multi.add(ProgressBar::new(0));
pb.enable_steady_tick(Duration::from_millis(50));
pb.set_style(ProgressStyle::default_bar()
.template("> {spinner:.blue} {prefix}")
.unwrap());
let pb_clone = pb.clone();
let callback = move |prefix: &str, msg: &str, progress: usize, total: usize| {
let pb = &pb_clone;
if progress != 0 && total != 0 {
pb.set_style(ProgressStyle::default_bar()
.template("> {spinner:.blue} {prefix}\n {msg} [{bar:40.cyan/blue}] {pos}/{len} ({eta})")
.unwrap()
.progress_chars("=> "));
} else {
pb.set_style(ProgressStyle::default_bar()
.template("> {spinner:.blue} {prefix}")
.unwrap());
}
if !prefix.is_empty() {
pb.set_prefix(prefix.to_string());
}
pb.set_message(msg.to_string());
pb.set_length(total as u64);
pb.set_position(progress as u64);
};
(pb, callback)
}