use indicatif::{ProgressBar as IndiBar, ProgressStyle};
pub struct ProgressBar {
bar: IndiBar,
}
impl ProgressBar {
pub fn new(total: u64) -> Self {
let bar = IndiBar::new(total);
bar.set_style(
ProgressStyle::default_bar()
.template("{spinner:.cyan} [{elapsed_precise}] [{bar:40.cyan/blue}] {pos}/{len} {msg}")
.unwrap()
.progress_chars("▰▱"),
);
Self { bar }
}
pub fn set_position(&self, pos: u64) {
self.bar.set_position(pos);
}
pub fn set_message(&self, msg: String) {
self.bar.set_message(msg);
}
pub fn finish_with_message(&self, msg: String) {
self.bar.finish_with_message(msg);
}
pub fn inner(&self) -> &IndiBar {
&self.bar
}
pub fn add_to(&self, multi: &indicatif::MultiProgress) -> IndiBar {
let bar = multi.add(self.bar.clone());
bar
}
}
pub struct Spinner {
spinner: indicatif::ProgressBar,
}
impl Spinner {
pub fn new(message: &str) -> Self {
let spinner = indicatif::ProgressBar::new_spinner();
spinner.set_style(
ProgressStyle::default_spinner()
.template("{spinner:.cyan} {msg}")
.unwrap(),
);
spinner.set_message(message.to_string());
Self { spinner }
}
pub fn set_message(&self, msg: &str) {
self.spinner.set_message(msg.to_string());
}
pub fn finish_with_message(&self, msg: &str) {
self.spinner.finish_with_message(msg.to_string());
}
pub fn inner(&self) -> &indicatif::ProgressBar {
&self.spinner
}
}
pub struct MultiProgress {
inner: indicatif::MultiProgress,
}
impl MultiProgress {
pub fn new() -> Self {
Self {
inner: indicatif::MultiProgress::new(),
}
}
pub fn add_spinner(&self, spinner: &Spinner) {
self.inner.add(spinner.inner().clone());
}
pub fn inner(&self) -> &indicatif::MultiProgress {
&self.inner
}
}
impl Default for MultiProgress {
fn default() -> Self {
Self::new()
}
}