use std::sync::Arc;
use std::time::Duration;
use console::style;
use indicatif::{MultiProgress, ProgressBar, ProgressStyle};
#[derive(PartialEq, Clone)]
pub enum LineStatus { Idle, Busy }
#[derive(Debug, Clone)]
pub struct Line {
bar: ProgressBar,
}
impl Line {
pub fn new(progress: Arc<MultiProgress>) -> Self {
Self { bar: progress.add(ProgressBar::new(0)) }
}
pub fn println(&self, message: String) {
self.bar.println(message);
}
pub fn update_prefix(&self, prefix: String) {
self.bar.set_prefix(prefix);
}
pub fn update_message(&self, status: LineStatus, message: String) {
if status == LineStatus::Busy {
self.bar.enable_steady_tick(Duration::from_millis(1000 / 30));
} else {
self.bar.disable_steady_tick()
}
let mut progress_style = ProgressStyle::default_spinner().template("{prefix:.bold.dim} {wide_msg}").unwrap();
if status == LineStatus::Busy {
progress_style = progress_style
.tick_chars("⠈⠐⠠⢀⡀⠄⠂⠁ ")
.template("{prefix:.bold.dim} {spinner:.yellow} {wide_msg} {binary_bytes_per_sec}").unwrap();
}
self.bar.set_style(progress_style);
let message = format!(
"{}{}",
match status {
LineStatus::Idle => style("- ").yellow(),
LineStatus::Busy => style("").white(),
},
message
);
self.bar.set_message(message);
}
pub fn update_position(&self, position: usize) {
self.bar.set_position(position as u64);
}
pub fn suspend<F: FnOnce() -> R, R>(&self, f: F) -> R {
self.bar.suspend(f)
}
}