98 lines
2.6 KiB
Rust
98 lines
2.6 KiB
Rust
|
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()));
|
||
|
}
|