ahiru_tpm/
progress_status.rs1use 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}