36 lines
1.2 KiB
Rust
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)
|
|
}
|