elph_agent/init/
progress.rs1use 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}