use std::io::IsTerminal;
use std::time::Duration;
use indicatif::{ProgressBar, ProgressStyle};
use crate::cli::GlobalArgs;
pub fn spinner(g: &GlobalArgs, message: &str) -> ProgressBar {
let interactive =
!g.is_json() && !g.quiet && !g.ci && !g.non_interactive && std::io::stderr().is_terminal();
if !interactive {
return ProgressBar::hidden();
}
let pb = ProgressBar::new_spinner();
if let Ok(style) = ProgressStyle::with_template("{spinner:.cyan} {msg}") {
pb.set_style(style.tick_strings(&["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏", ""]));
}
pb.enable_steady_tick(Duration::from_millis(80));
pb.set_message(message.to_string());
pb
}
#[cfg(test)]
mod tests {
use super::*;
use crate::cli::Format;
fn args(format: Format, quiet: bool, ci: bool, non_interactive: bool) -> GlobalArgs {
GlobalArgs {
project: None,
board_yaml: None,
sdk_root: None,
target: None,
all: false,
format,
verbose: false,
quiet,
no_color: false,
non_interactive,
ci,
}
}
#[test]
fn hidden_in_json_quiet_ci_and_non_interactive() {
assert!(spinner(&args(Format::Json, false, false, false), "x").is_hidden());
assert!(spinner(&args(Format::Text, true, false, false), "x").is_hidden());
assert!(spinner(&args(Format::Text, false, true, false), "x").is_hidden());
assert!(spinner(&args(Format::Text, false, false, true), "x").is_hidden());
}
}