use console::Term;
pub struct Spinner {
term: Option<Term>,
message: String,
finished: bool,
}
impl Spinner {
#[must_use]
pub fn new(msg: impl Into<String>) -> Self {
let term = Term::stderr();
let active = term.is_term().then_some(term);
let message = msg.into();
let s = Self { term: active, message, finished: false };
s.draw();
s
}
pub fn set_message(&mut self, msg: impl Into<String>) {
self.message = msg.into();
self.draw();
}
pub fn finish(mut self) {
self.finish_inner();
}
fn finish_inner(&mut self) {
if self.finished {
return;
}
self.finished = true;
if let Some(term) = &self.term {
let _ = term.clear_line();
}
}
fn draw(&self) {
if let Some(term) = &self.term {
let _ = term.clear_line();
let _ = term.write_str(&format!("⠋ {}", self.message));
}
}
}
impl Drop for Spinner {
fn drop(&mut self) {
self.finish_inner();
}
}