use nanospinner::{MultiSpinner, Spinner};
use std::io;
use std::sync::{Arc, Mutex};
#[derive(Clone)]
struct BufWriter(Arc<Mutex<Vec<u8>>>);
impl io::Write for BufWriter {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.0.lock().unwrap().write(buf)
}
fn flush(&mut self) -> io::Result<()> {
self.0.lock().unwrap().flush()
}
}
fn drain(buf: &Arc<Mutex<Vec<u8>>>) -> String {
let mut v = buf.lock().unwrap();
let s = String::from_utf8(v.clone()).expect("valid UTF-8");
v.clear();
s
}
fn main() {
let buf = Arc::new(Mutex::new(Vec::<u8>::new()));
println!("Single spinner:\n");
let h = Spinner::with_writer("Compiling...", BufWriter(Arc::clone(&buf))).start();
h.success();
let h = Spinner::with_writer("Deploying...", BufWriter(Arc::clone(&buf))).start();
h.fail_with("Connection refused");
let h = Spinner::with_writer("Step 1...", BufWriter(Arc::clone(&buf))).start();
h.update("Step 2...");
h.success();
print!("{}", drain(&buf));
println!("\nMulti-spinner with clears:\n");
let handle = MultiSpinner::with_writer(BufWriter(Arc::clone(&buf))).start();
let build = handle.add("Building project...");
let lint = handle.add("Running linter...");
let test = handle.add("Running tests...");
let docs = handle.add("Generating docs...");
lint.clear(); build.success();
docs.fail_with("Missing doc comments.");
test.success_with("42 tests passed.");
print!("{}", drain(&buf));
}