oxur_cli/common/
progress.rs1use colored::*;
7
8pub struct ProgressTracker {
34 current_step: usize,
35 verbose: bool,
36}
37
38impl ProgressTracker {
39 pub fn new(verbose: bool) -> Self {
45 Self { current_step: 0, verbose }
46 }
47
48 pub fn step(&mut self, msg: &str) {
53 if self.verbose {
54 self.current_step += 1;
55 println!("{}. {}...", self.current_step, msg);
56 }
57 }
58
59 pub fn done(&self) {
64 if self.verbose {
65 println!(" {} Done", "✓".green());
66 }
67 }
68
69 pub fn success(&self, msg: &str) {
74 if self.verbose {
75 println!();
76 }
77 println!("{} {}", "✓".green().bold(), msg);
78 }
79
80 pub fn error(&self, msg: &str) {
84 eprintln!("{} {}", "Error:".red().bold(), msg);
85 }
86
87 pub fn info(&self, msg: &str) {
91 if self.verbose {
92 println!("{} {}", "→".cyan(), msg);
93 }
94 }
95
96 pub fn is_verbose(&self) -> bool {
98 self.verbose
99 }
100}
101
102#[cfg(test)]
103mod tests {
104 use super::*;
105
106 #[test]
107 fn test_new_verbose() {
108 let tracker = ProgressTracker::new(true);
109 assert!(tracker.is_verbose());
110 assert_eq!(tracker.current_step, 0);
111 }
112
113 #[test]
114 fn test_new_non_verbose() {
115 let tracker = ProgressTracker::new(false);
116 assert!(!tracker.is_verbose());
117 }
118
119 #[test]
120 fn test_step_increments_counter() {
121 let mut tracker = ProgressTracker::new(true);
122 assert_eq!(tracker.current_step, 0);
123
124 tracker.step("First step");
125 assert_eq!(tracker.current_step, 1);
126
127 tracker.step("Second step");
128 assert_eq!(tracker.current_step, 2);
129 }
130
131 #[test]
132 fn test_step_non_verbose_no_increment() {
133 let mut tracker = ProgressTracker::new(false);
134 tracker.step("Step");
135 assert_eq!(tracker.current_step, 0);
136 }
137
138 #[test]
139 fn test_done_verbose() {
140 let tracker = ProgressTracker::new(true);
141 tracker.done();
142 }
143
144 #[test]
145 fn test_done_non_verbose() {
146 let tracker = ProgressTracker::new(false);
147 tracker.done();
148 }
149
150 #[test]
151 fn test_success() {
152 let tracker = ProgressTracker::new(true);
153 tracker.success("All done!");
154 }
155
156 #[test]
157 fn test_error() {
158 let tracker = ProgressTracker::new(true);
159 tracker.error("Something failed");
160 }
161
162 #[test]
163 fn test_info_verbose() {
164 let tracker = ProgressTracker::new(true);
165 tracker.info("Additional info");
166 }
167
168 #[test]
169 fn test_info_non_verbose() {
170 let tracker = ProgressTracker::new(false);
171 tracker.info("This shouldn't display");
172 }
173}