zim_studio/utils/progress.rs
1//! Progress bar utilities for creating consistent progress indicators across commands.
2//!
3//! This module provides standardized progress bar and spinner creation functions
4//! to ensure consistent user experience across all CLI commands.
5
6use crate::constants::SPINNER_CHARS;
7use indicatif::{ProgressBar, ProgressStyle};
8
9/// Create a standard progress spinner with consistent styling.
10///
11/// # Returns
12///
13/// A configured `ProgressBar` instance in spinner mode with cyan styling
14/// and the standard spinner character sequence.
15///
16/// # Example
17///
18/// ```ignore
19/// use crate::utils::progress::create_progress_spinner;
20///
21/// let spinner = create_progress_spinner();
22/// spinner.set_message("Scanning files...");
23/// // ... do work ...
24/// spinner.finish_and_clear();
25/// ```
26pub fn create_progress_spinner() -> ProgressBar {
27 let spinner = ProgressBar::new_spinner();
28 spinner.set_style(
29 ProgressStyle::default_spinner()
30 .template("{spinner:.cyan} {msg}")
31 .unwrap()
32 .tick_strings(SPINNER_CHARS),
33 );
34 spinner
35}
36
37/// Create a standard progress bar with consistent styling.
38///
39/// # Arguments
40///
41/// * `total` - The total number of items to process
42///
43/// # Returns
44///
45/// A configured `ProgressBar` instance with a cyan/blue color scheme
46/// and standard progress bar formatting.
47///
48/// # Example
49///
50/// ```ignore
51/// use crate::utils::progress::create_progress_bar;
52///
53/// let pb = create_progress_bar(100);
54/// for i in 0..100 {
55/// // ... do work ...
56/// pb.inc(1);
57/// }
58/// pb.finish_with_message("Done");
59/// ```
60pub fn create_progress_bar(total: u64) -> ProgressBar {
61 let pb = ProgressBar::new(total);
62 pb.set_style(
63 ProgressStyle::default_bar()
64 .template("{spinner:.cyan} [{bar:40.cyan/blue}] {pos}/{len} {msg}")
65 .unwrap()
66 .progress_chars("█▓░"),
67 );
68 pb
69}
70
71#[cfg(test)]
72mod tests {
73 use super::*;
74
75 #[test]
76 fn test_create_progress_spinner() {
77 let spinner = create_progress_spinner();
78 // Just verify it creates without panicking
79 spinner.set_message("Test message");
80 spinner.finish_and_clear();
81 }
82
83 #[test]
84 fn test_create_progress_bar() {
85 let pb = create_progress_bar(100);
86 // Just verify it creates without panicking
87 pb.set_position(50);
88 pb.finish();
89 }
90}