Skip to main content

elph_agent/init/
progress.rs

1use std::borrow::Cow;
2use std::io::{IsTerminal, stderr};
3use std::time::Duration;
4
5use indicatif::{ProgressBar, ProgressStyle};
6
7pub struct InitProgress {
8    bar: ProgressBar,
9    quiet_env: Option<&'static str>,
10}
11
12impl InitProgress {
13    pub fn new(steps: u64) -> Self {
14        let bar = if Self::enabled(None) {
15            let bar = ProgressBar::new(steps);
16            bar.set_style(
17                ProgressStyle::default_bar()
18                    .template("{spinner:.green} {wide_msg:.cyan} [{bar:24.cyan/blue}] {pos}/{len}")
19                    .expect("valid init progress template")
20                    .progress_chars("━━╸─"),
21            );
22            bar.enable_steady_tick(Duration::from_millis(80));
23            bar
24        } else {
25            ProgressBar::hidden()
26        };
27
28        Self { bar, quiet_env: None }
29    }
30
31    pub fn with_quiet_env(mut self, env: &'static str) -> Self {
32        self.quiet_env = Some(env);
33        if !Self::enabled(self.quiet_env) {
34            self.bar = ProgressBar::hidden();
35        }
36        self
37    }
38
39    pub fn advance(&self, message: impl Into<Cow<'static, str>>) {
40        self.bar.inc(1);
41        self.bar.set_message(message);
42    }
43
44    pub fn finish(&self) {
45        self.bar.finish_and_clear();
46    }
47
48    fn enabled(quiet_env: Option<&'static str>) -> bool {
49        if cfg!(test) {
50            return false;
51        }
52        if quiet_env.is_some_and(|name| std::env::var_os(name).is_some()) {
53            return false;
54        }
55        if std::env::var("NO_COLOR").as_deref() == Ok("true") {
56            return false;
57        }
58        stderr().is_terminal()
59    }
60}