use crate::error::Error;
use crate::op::OpProgress;
use crate::result::Result;
use indicatif::{ProgressBar, ProgressStyle};
use uuid::Uuid;
pub(crate) struct Indicator {
id: Uuid,
progress_bar: ProgressBar,
}
impl Indicator {
pub(crate) fn new(len: Option<OpProgress>) -> Result<Self> {
let (progress_bar, template) = match len {
Some(n) => (
ProgressBar::new(n),
"[{elapsed_precise:.green}] {spinner:.cyan/blue} {pos:>7} {wide_msg:.yellow}",
),
None => (
ProgressBar::new_spinner(),
"[{elapsed_precise:.green}] {spinner:.cyan/blue} {wide_msg:.yellow}",
),
};
progress_bar.set_style(
ProgressStyle::with_template(template)
.map_err(|_| Error::CouldNotConfigureProgressBar)?,
);
Ok(Self {
id: Uuid::new_v4(),
progress_bar,
})
}
pub(crate) fn id(&self) -> &Uuid {
&self.id
}
pub(crate) fn set_progress(&self, value: OpProgress) {
self.progress_bar.set_position(value)
}
pub(crate) fn set_message(&self, s: &str) {
self.progress_bar.set_message(String::from(s))
}
pub(crate) fn print(&self, s: &str) {
self.progress_bar.println(s)
}
}