use anyhow::Result;
use indicatif::{ProgressBar, ProgressStyle};
use wash_lib::cli::OutputKind;
pub const DOTS_12: &[&str; 56] = &[
"⢀⠀", "⡀⠀", "⠄⠀", "⢂⠀", "⡂⠀", "⠅⠀", "⢃⠀", "⡃⠀", "⠍⠀", "⢋⠀", "⡋⠀", "⠍⠁", "⢋⠁", "⡋⠁", "⠍⠉", "⠋⠉",
"⠋⠉", "⠉⠙", "⠉⠙", "⠉⠩", "⠈⢙", "⠈⡙", "⢈⠩", "⡀⢙", "⠄⡙", "⢂⠩", "⡂⢘", "⠅⡘", "⢃⠨", "⡃⢐", "⠍⡐", "⢋⠠",
"⡋⢀", "⠍⡁", "⢋⠁", "⡋⠁", "⠍⠉", "⠋⠉", "⠋⠉", "⠉⠙", "⠉⠙", "⠉⠩", "⠈⢙", "⠈⡙", "⠈⠩", "⠀⢙", "⠀⡙", "⠀⠩",
"⠀⢘", "⠀⡘", "⠀⠨", "⠀⢐", "⠀⡐", "⠀⠠", "⠀⢀", "⠀⡀",
];
pub struct Spinner {
spinner: Option<ProgressBar>,
}
impl Spinner {
pub fn new(output_kind: &OutputKind) -> Result<Self> {
match output_kind {
OutputKind::Text => {
let style = ProgressStyle::default_spinner()
.tick_strings(DOTS_12)
.template("{prefix:.bold.dim} {spinner:.bold.dim} {wide_msg:.bold.dim}")?;
let spinner = ProgressBar::new_spinner().with_style(style);
spinner.enable_steady_tick(std::time::Duration::from_millis(200));
Ok(Self {
spinner: Some(spinner),
})
}
OutputKind::Json => Ok(Self { spinner: None }),
}
}
pub fn update_spinner_message(&self, msg: String) {
match &self.spinner {
Some(spinner) => {
spinner.set_prefix(">>>");
spinner.set_message(msg);
}
None => {}
}
}
pub fn finish_and_clear(&self) {
match &self.spinner {
Some(progress_bar) => progress_bar.finish_and_clear(),
None => {}
}
}
}