sparrow/streaming/
progress.rs1use indicatif::{ProgressBar as IndiBar, ProgressStyle};
6
7pub struct ProgressBar {
9 bar: IndiBar,
10}
11
12impl ProgressBar {
13 pub fn new(total: u64) -> Self {
15 let bar = IndiBar::new(total);
16 bar.set_style(
17 ProgressStyle::default_bar()
18 .template(
19 "{spinner:.cyan} [{elapsed_precise}] [{bar:40.cyan/blue}] {pos}/{len} {msg}",
20 )
21 .unwrap()
22 .progress_chars("▰▱"),
23 );
24 Self { bar }
25 }
26
27 pub fn set_position(&self, pos: u64) {
29 self.bar.set_position(pos);
30 }
31
32 pub fn set_message(&self, msg: String) {
34 self.bar.set_message(msg);
35 }
36
37 pub fn finish_with_message(&self, msg: String) {
39 self.bar.finish_with_message(msg);
40 }
41
42 pub fn inner(&self) -> &IndiBar {
44 &self.bar
45 }
46
47 pub fn add_to(&self, multi: &indicatif::MultiProgress) -> IndiBar {
49 let bar = multi.add(self.bar.clone());
50 bar
51 }
52}
53
54pub struct Spinner {
56 spinner: indicatif::ProgressBar,
57}
58
59impl Spinner {
60 pub fn new(message: &str) -> Self {
62 let spinner = indicatif::ProgressBar::new_spinner();
63 spinner.set_style(
64 ProgressStyle::default_spinner()
65 .template("{spinner:.cyan} {msg}")
66 .unwrap(),
67 );
68 spinner.set_message(message.to_string());
69 Self { spinner }
70 }
71
72 pub fn set_message(&self, msg: &str) {
74 self.spinner.set_message(msg.to_string());
75 }
76
77 pub fn finish_with_message(&self, msg: &str) {
79 self.spinner.finish_with_message(msg.to_string());
80 }
81
82 pub fn inner(&self) -> &indicatif::ProgressBar {
84 &self.spinner
85 }
86}
87
88pub struct MultiProgress {
90 inner: indicatif::MultiProgress,
91}
92
93impl MultiProgress {
94 pub fn new() -> Self {
96 Self {
97 inner: indicatif::MultiProgress::new(),
98 }
99 }
100
101 pub fn add_spinner(&self, spinner: &Spinner) {
103 self.inner.add(spinner.inner().clone());
104 }
105
106 pub fn inner(&self) -> &indicatif::MultiProgress {
108 &self.inner
109 }
110}
111
112impl Default for MultiProgress {
113 fn default() -> Self {
114 Self::new()
115 }
116}