use colored::*;
use std::sync::atomic::{AtomicBool, Ordering};
static VERBOSE: AtomicBool = AtomicBool::new(false);
pub struct UI;
impl UI {
pub fn set_verbose(verbose: bool) {
VERBOSE.store(verbose, Ordering::Relaxed);
}
pub fn is_verbose() -> bool {
VERBOSE.load(Ordering::Relaxed)
}
pub fn info(message: &str) {
println!("{} {}", "ℹ".blue(), message);
}
pub fn success(message: &str) {
println!("{} {}", "✅".green(), message);
}
pub fn warn(message: &str) {
println!("{} {}", "⚠".yellow(), message.yellow());
}
pub fn error(message: &str) {
eprintln!("{} {}", "❌".red(), message.red());
}
pub fn debug(message: &str) {
if Self::is_verbose() {
println!("{} {}", "🐛".purple(), message.dimmed());
}
}
pub fn hint(message: &str) {
println!("{} {}", "💡".cyan(), message.dimmed());
}
pub fn item(message: &str) {
println!(" {}", message);
}
pub fn detail(message: &str) {
println!(" {}", message.dimmed());
}
pub fn separator() {
println!("{}", "─".repeat(50).dimmed());
}
pub fn header(message: &str) {
println!("\n{}", message.bold().underline());
}
pub fn progress(message: &str) {
print!("{} {}...", "⏳".yellow(), message);
std::io::Write::flush(&mut std::io::stdout()).unwrap();
}
pub fn progress_done() {
println!(" {}", "Done!".green());
}
pub fn spinner(message: &str) {
println!("{} {}", "⏳".yellow(), message);
}
pub fn step(message: &str) {
println!("{} {}", "▶".blue(), message);
}
pub fn warning(message: &str) {
Self::warn(message);
}
pub fn new_spinner(message: &str) -> SimpleSpinner {
Self::spinner(message);
SimpleSpinner
}
}
pub struct SimpleSpinner;
impl SimpleSpinner {
pub fn finish_and_clear(&self) {
println!(" {}", "Done!".green());
}
}