Skip to main content

tftio_cli_common/
progress.rs

1//! Shared progress indicator helpers.
2
3use std::time::Duration;
4
5use indicatif::{ProgressBar, ProgressDrawTarget, ProgressStyle};
6
7use crate::output::stderr_is_tty;
8
9/// Build a stderr spinner when interactive progress is enabled.
10#[must_use]
11pub fn make_spinner(enabled: bool, message: &str) -> Option<ProgressBar> {
12    if !enabled || !stderr_is_tty() {
13        return None;
14    }
15
16    let progress_bar = ProgressBar::with_draw_target(None, ProgressDrawTarget::stderr());
17    progress_bar.set_style(
18        ProgressStyle::default_spinner()
19            .template("{spinner:.green} {msg}")
20            .expect("valid spinner template"),
21    );
22    progress_bar.set_message(message.to_owned());
23    progress_bar.enable_steady_tick(Duration::from_millis(120));
24
25    Some(progress_bar)
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    #[test]
33    fn make_spinner_returns_none_when_disabled() {
34        assert!(make_spinner(false, "x").is_none());
35    }
36}