fparkan/vendor/indicatif/examples/yarnish.rs
Valentin Popov 1b6a04ca55
Initial vendor packages
Signed-off-by: Valentin Popov <valentin@popov.link>
2024-01-08 01:21:28 +04:00

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