ricecoder_cli/
progress.rs

1// Progress indicators and spinners
2
3use indicatif::{ProgressBar, ProgressStyle};
4use std::time::Duration;
5
6/// Create a spinner for long-running operations
7pub fn create_spinner(message: &str) -> ProgressBar {
8    let spinner = ProgressBar::new_spinner();
9    spinner.set_style(
10        ProgressStyle::default_spinner()
11            .tick_strings(&["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"])
12            .template("{spinner:.cyan} {msg}")
13            .unwrap(),
14    );
15    spinner.set_message(message.to_string());
16    spinner.enable_steady_tick(Duration::from_millis(80));
17    spinner
18}
19
20/// Create a progress bar for operations with known length
21pub fn create_progress_bar(total: u64, message: &str) -> ProgressBar {
22    let pb = ProgressBar::new(total);
23    pb.set_style(
24        ProgressStyle::default_bar()
25            .template("{msg} [{bar:40.cyan/blue}] {pos}/{len}")
26            .unwrap()
27            .progress_chars("=>-"),
28    );
29    pb.set_message(message.to_string());
30    pb
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36
37    #[test]
38    fn test_spinner_creation() {
39        let spinner = create_spinner("Testing...");
40        assert!(!spinner.is_finished());
41        spinner.finish_with_message("Done!");
42    }
43
44    #[test]
45    fn test_progress_bar_creation() {
46        let pb = create_progress_bar(100, "Processing...");
47        assert_eq!(pb.length(), Some(100));
48        pb.finish_with_message("Complete!");
49    }
50}