Skip to main content

ahiru_tpm/
progress_status.rs

1use std::time::Duration;
2
3use anyhow::{Context, Result};
4use colored::Colorize;
5use indicatif::{MultiProgress, ProgressBar, ProgressStyle};
6
7pub struct ProgressStatus {
8    multi_progress: MultiProgress,
9}
10
11impl Default for ProgressStatus {
12    fn default() -> Self {
13        Self::new()
14    }
15}
16
17impl ProgressStatus {
18    pub fn new() -> ProgressStatus {
19        let multi_progress = MultiProgress::new();
20
21        ProgressStatus { multi_progress }
22    }
23
24    pub fn add_task(&self, task_name: &str, initial_status: &str) -> Result<ProgressTask> {
25        let progress_bar = self.multi_progress.add(ProgressBar::new_spinner());
26        let progress_task = ProgressTask::new(progress_bar, task_name.to_string());
27        progress_task.set_status(initial_status)?;
28        Ok(progress_task)
29    }
30}
31
32pub struct ProgressTask {
33    task_name: String,
34    progress_bar: ProgressBar,
35}
36
37impl ProgressTask {
38    pub fn new(progress_bar: ProgressBar, task_name: String) -> ProgressTask {
39        ProgressTask {
40            task_name,
41            progress_bar,
42        }
43    }
44
45    pub fn set_status(&self, status: &str) -> Result<()> {
46        self.progress_bar
47            .set_message(format!("{:<64} {}", self.task_name, status.bold().cyan()));
48        self.progress_bar
49            .enable_steady_tick(Duration::from_millis(100));
50        self.progress_bar.set_style(
51            ProgressStyle::with_template("{spinner:.cyan} {msg}")
52                .context("Failed to set progress style")?,
53        );
54        Ok(())
55    }
56
57    pub fn set_success(&self, status: &str) -> Result<()> {
58        self.progress_bar.set_style(
59            ProgressStyle::with_template(&format!("{} {}", "✔".bold().green(), "{msg}"))
60                .context("Failed to set progress style")?,
61        );
62        self.progress_bar.finish_with_message(format!(
63            "{:<64} {}",
64            self.task_name,
65            status.bold().green()
66        ));
67        Ok(())
68    }
69
70    pub fn set_failed(&self, status: &str) -> Result<()> {
71        self.progress_bar.set_style(
72            ProgressStyle::with_template(&format!("{} {}", "✘".bold().red(), "{msg}"))
73                .context("Failed to set progress style")?,
74        );
75        self.progress_bar.finish_with_message(format!(
76            "{:<64} {}",
77            self.task_name,
78            status.bold().red()
79        ));
80        Ok(())
81    }
82}