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) }