use std::thread; use std::time::Duration; use indicatif::{MultiProgress, ProgressBar, ProgressStyle}; use rand::{thread_rng, Rng}; fn main() { let styles = [ ("Rough bar:", "█ ", "red"), ("Fine bar: ", "█▉▊▋▌▍▎▏ ", "yellow"), ("Vertical: ", "█▇▆▅▄▃▂▁ ", "green"), ("Fade in: ", "█▓▒░ ", "blue"), ("Blocky: ", "█▛▌▖ ", "magenta"), ]; let m = MultiProgress::new(); let handles: Vec<_> = styles .iter() .map(|s| { let pb = m.add(ProgressBar::new(512)); pb.set_style( ProgressStyle::with_template(&format!("{{prefix:.bold}}▕{{bar:.{}}}▏{{msg}}", s.2)) .unwrap() .progress_chars(s.1), ); pb.set_prefix(s.0); let wait = Duration::from_millis(thread_rng().gen_range(10..30)); thread::spawn(move || { for i in 0..512 { thread::sleep(wait); pb.inc(1); pb.set_message(format!("{:3}%", 100 * i / 512)); } pb.finish_with_message("100%"); }) }) .collect(); for h in handles { let _ = h.join(); } }