use std::thread; use std::time::{Duration, Instant}; use console::{style, Emoji}; use indicatif::{HumanDuration, MultiProgress, ProgressBar, ProgressStyle}; use rand::seq::SliceRandom; use rand::Rng; static PACKAGES: &[&str] = &[ "fs-events", "my-awesome-module", "emoji-speaker", "wrap-ansi", "stream-browserify", "acorn-dynamic-import", ]; static COMMANDS: &[&str] = &[ "cmake .", "make", "make clean", "gcc foo.c -o foo", "gcc bar.c -o bar", "./helper.sh rebuild-cache", "make all-clean", "make test", ]; static LOOKING_GLASS: Emoji<'_, '_> = Emoji("🔍 ", ""); static TRUCK: Emoji<'_, '_> = Emoji("🚚 ", ""); static CLIP: Emoji<'_, '_> = Emoji("🔗 ", ""); static PAPER: Emoji<'_, '_> = Emoji("📃 ", ""); static SPARKLE: Emoji<'_, '_> = Emoji("✨ ", ":-)"); pub fn main() { let mut rng = rand::thread_rng(); let started = Instant::now(); let spinner_style = ProgressStyle::with_template("{prefix:.bold.dim} {spinner} {wide_msg}") .unwrap() .tick_chars("⠁⠂⠄⡀⢀⠠⠐⠈ "); println!( "{} {}Resolving packages...", style("[1/4]").bold().dim(), LOOKING_GLASS ); println!( "{} {}Fetching packages...", style("[2/4]").bold().dim(), TRUCK ); println!( "{} {}Linking dependencies...", style("[3/4]").bold().dim(), CLIP ); let deps = 1232; let pb = ProgressBar::new(deps); for _ in 0..deps { thread::sleep(Duration::from_millis(3)); pb.inc(1); } pb.finish_and_clear(); println!( "{} {}Building fresh packages...", style("[4/4]").bold().dim(), PAPER ); let m = MultiProgress::new(); let handles: Vec<_> = (0..4u32) .map(|i| { let count = rng.gen_range(30..80); let pb = m.add(ProgressBar::new(count)); pb.set_style(spinner_style.clone()); pb.set_prefix(format!("[{}/?]", i + 1)); thread::spawn(move || { let mut rng = rand::thread_rng(); let pkg = PACKAGES.choose(&mut rng).unwrap(); for _ in 0..count { let cmd = COMMANDS.choose(&mut rng).unwrap(); thread::sleep(Duration::from_millis(rng.gen_range(25..200))); pb.set_message(format!("{pkg}: {cmd}")); pb.inc(1); } pb.finish_with_message("waiting..."); }) }) .collect(); for h in handles { let _ = h.join(); } m.clear().unwrap(); println!("{} Done in {}", SPARKLE, HumanDuration(started.elapsed())); }