use indicatif::{MultiProgress, ProgressBar, ProgressStyle};
use std::time::Duration;
pub fn create_progress_bar(total: u64, message: &str) -> ProgressBar {
let pb = ProgressBar::new(total);
pb.set_style(
ProgressStyle::default_bar()
.template("{spinner:.green} [{elapsed_precise}] [{bar:40.cyan/blue}] {pos}/{len} {msg}")
.unwrap()
.progress_chars("#>-"),
);
pb.set_message(message.to_string());
pb.enable_steady_tick(Duration::from_millis(100));
pb
}
pub fn create_spinner(message: &str) -> ProgressBar {
let spinner = ProgressBar::new_spinner();
spinner.set_style(
ProgressStyle::default_spinner()
.template("{spinner:.green} {msg}")
.unwrap()
.tick_strings(&["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]),
);
spinner.set_message(message.to_string());
spinner.enable_steady_tick(Duration::from_millis(80));
spinner
}
pub struct ProgressTracker {
multi: MultiProgress,
main_bar: ProgressBar,
}
impl ProgressTracker {
pub fn new(total: u64, message: &str) -> Self {
let multi = MultiProgress::new();
let main_bar = multi.add(create_progress_bar(total, message));
Self { multi, main_bar }
}
pub fn add_worker(&self, message: &str) -> ProgressBar {
self.multi.add(create_spinner(message))
}
pub fn inc(&self, delta: u64) {
self.main_bar.inc(delta);
}
pub fn set_message(&self, message: &str) {
self.main_bar.set_message(message.to_string());
}
pub fn finish_with_message(&self, message: &str) {
self.main_bar.finish_with_message(message.to_string());
}
pub fn multi(&self) -> &MultiProgress {
&self.multi
}
}
pub fn create_benchmark_progress(iterations: u64) -> ProgressBar {
let pb = ProgressBar::new(iterations);
pb.set_style(
ProgressStyle::default_bar()
.template("{msg} [{bar:30.yellow/blue}] {pos}/{len}")
.unwrap()
.progress_chars("=>-"),
);
pb.set_message("Running benchmark");
pb
}
pub fn with_spinner<F, T>(message: &str, operation: F) -> T
where
F: FnOnce() -> T,
{
let spinner = create_spinner(message);
let result = operation();
spinner.finish_and_clear();
result
}