use colored::*;
pub struct ProgressTracker {
current_step: usize,
verbose: bool,
}
impl ProgressTracker {
pub fn new(verbose: bool) -> Self {
Self { current_step: 0, verbose }
}
pub fn step(&mut self, msg: &str) {
if self.verbose {
self.current_step += 1;
println!("{}. {}...", self.current_step, msg);
}
}
pub fn done(&self) {
if self.verbose {
println!(" {} Done", "✓".green());
}
}
pub fn success(&self, msg: &str) {
if self.verbose {
println!();
}
println!("{} {}", "✓".green().bold(), msg);
}
pub fn error(&self, msg: &str) {
eprintln!("{} {}", "Error:".red().bold(), msg);
}
pub fn info(&self, msg: &str) {
if self.verbose {
println!("{} {}", "→".cyan(), msg);
}
}
pub fn is_verbose(&self) -> bool {
self.verbose
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_new_verbose() {
let tracker = ProgressTracker::new(true);
assert!(tracker.is_verbose());
assert_eq!(tracker.current_step, 0);
}
#[test]
fn test_new_non_verbose() {
let tracker = ProgressTracker::new(false);
assert!(!tracker.is_verbose());
}
#[test]
fn test_step_increments_counter() {
let mut tracker = ProgressTracker::new(true);
assert_eq!(tracker.current_step, 0);
tracker.step("First step");
assert_eq!(tracker.current_step, 1);
tracker.step("Second step");
assert_eq!(tracker.current_step, 2);
}
#[test]
fn test_step_non_verbose_no_increment() {
let mut tracker = ProgressTracker::new(false);
tracker.step("Step");
assert_eq!(tracker.current_step, 0);
}
#[test]
fn test_done_verbose() {
let tracker = ProgressTracker::new(true);
tracker.done();
}
#[test]
fn test_done_non_verbose() {
let tracker = ProgressTracker::new(false);
tracker.done();
}
#[test]
fn test_success() {
let tracker = ProgressTracker::new(true);
tracker.success("All done!");
}
#[test]
fn test_error() {
let tracker = ProgressTracker::new(true);
tracker.error("Something failed");
}
#[test]
fn test_info_verbose() {
let tracker = ProgressTracker::new(true);
tracker.info("Additional info");
}
#[test]
fn test_info_non_verbose() {
let tracker = ProgressTracker::new(false);
tracker.info("This shouldn't display");
}
}