Skip to main content

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}