use crate::ui::{fail_message, fail_symbol, succeed_message, succeed_symbol};
use smbcloud_deploy::Reporter;
use spinners::{Spinner, Spinners};
use std::sync::Mutex;
pub struct SpinnerReporter {
current: Mutex<Option<Spinner>>,
}
impl SpinnerReporter {
pub fn new() -> Self {
Self {
current: Mutex::new(None),
}
}
fn finish(&self, symbol: String, message: String) {
match self.current.lock().unwrap().take() {
Some(mut spinner) => spinner.stop_and_persist(&symbol, message),
None => println!("{symbol} {message}"),
}
}
}
impl Default for SpinnerReporter {
fn default() -> Self {
Self::new()
}
}
impl Reporter for SpinnerReporter {
fn step_start(&self, msg: &str) {
*self.current.lock().unwrap() = Some(Spinner::new(
Spinners::SimpleDotsScrolling,
succeed_message(msg),
));
}
fn step_done(&self, msg: &str) {
self.finish(succeed_symbol(), succeed_message(msg));
}
fn step_fail(&self, msg: &str) {
self.finish(fail_symbol(), fail_message(msg));
}
fn info(&self, msg: &str) {
println!("{}", succeed_message(msg));
}
fn remote_line(&self, line: &str) {
println!("{line}");
}
}