1use colored::*;
4use std::sync::atomic::{AtomicBool, Ordering};
5
6static VERBOSE: AtomicBool = AtomicBool::new(false);
7
8pub struct UI;
10
11impl UI {
12 pub fn set_verbose(verbose: bool) {
14 VERBOSE.store(verbose, Ordering::Relaxed);
15 }
16
17 pub fn is_verbose() -> bool {
19 VERBOSE.load(Ordering::Relaxed)
20 }
21
22 pub fn info(message: &str) {
24 println!("{} {}", "ℹ".blue(), message);
25 }
26
27 pub fn success(message: &str) {
29 println!("{} {}", "✅".green(), message);
30 }
31
32 pub fn warn(message: &str) {
34 println!("{} {}", "⚠".yellow(), message.yellow());
35 }
36
37 pub fn error(message: &str) {
39 eprintln!("{} {}", "❌".red(), message.red());
40 }
41
42 pub fn debug(message: &str) {
44 if Self::is_verbose() {
45 println!("{} {}", "🐛".purple(), message.dimmed());
46 }
47 }
48
49 pub fn hint(message: &str) {
51 println!("{} {}", "💡".cyan(), message.dimmed());
52 }
53
54 pub fn item(message: &str) {
56 println!(" {}", message);
57 }
58
59 pub fn detail(message: &str) {
61 println!(" {}", message.dimmed());
62 }
63
64 pub fn separator() {
66 println!("{}", "─".repeat(50).dimmed());
67 }
68
69 pub fn header(message: &str) {
71 println!("\n{}", message.bold().underline());
72 }
73
74 pub fn progress(message: &str) {
76 print!("{} {}...", "⏳".yellow(), message);
77 std::io::Write::flush(&mut std::io::stdout()).unwrap();
78 }
79
80 pub fn progress_done() {
82 println!(" {}", "Done!".green());
83 }
84
85 pub fn spinner(message: &str) {
87 println!("{} {}", "⏳".yellow(), message);
88 }
89
90 pub fn step(message: &str) {
92 println!("{} {}", "▶".blue(), message);
93 }
94
95 pub fn warning(message: &str) {
97 Self::warn(message);
98 }
99
100 pub fn new_spinner(message: &str) -> SimpleSpinner {
102 Self::spinner(message);
103 SimpleSpinner
104 }
105}
106
107pub struct SimpleSpinner;
109
110impl SimpleSpinner {
111 pub fn finish_and_clear(&self) {
112 println!(" {}", "Done!".green());
114 }
115}