wb_cache/test/simulation/progress/
traits.rs

1use std::borrow::Cow;
2
3use indicatif::MultiProgress;
4use indicatif::ProgressBar;
5
6#[allow(dead_code)]
7pub trait MaybeProgress {
8    fn maybe_set_length(&self, len: u64);
9    fn maybe_inc(&self, n: u64);
10    fn maybe_enable_steady_tick(&self, dur: std::time::Duration);
11    fn maybe_finish(&self);
12    fn maybe_finish_with_message(&self, msg: impl Into<Cow<'static, str>>);
13    fn maybe_set_message(&self, msg: impl Into<Cow<'static, str>>);
14    fn maybe_set_prefix(&self, prefix: impl Into<Cow<'static, str>>);
15    fn maybe_set_position(&self, pos: u64);
16    fn maybe_per_sec(&self) -> f64;
17}
18
19impl MaybeProgress for Option<ProgressBar> {
20    fn maybe_set_length(&self, len: u64) {
21        if let Some(pb) = self {
22            pb.set_length(len);
23        }
24    }
25
26    fn maybe_inc(&self, n: u64) {
27        if let Some(pb) = self {
28            pb.inc(n);
29        }
30    }
31
32    fn maybe_enable_steady_tick(&self, dur: std::time::Duration) {
33        if let Some(pb) = self {
34            pb.enable_steady_tick(dur);
35        }
36    }
37
38    fn maybe_finish(&self) {
39        if let Some(pb) = self {
40            pb.finish();
41        }
42    }
43
44    fn maybe_finish_with_message(&self, msg: impl Into<Cow<'static, str>>) {
45        if let Some(pb) = self {
46            pb.finish_with_message(msg);
47        }
48    }
49
50    fn maybe_set_message(&self, msg: impl Into<Cow<'static, str>>) {
51        if let Some(pb) = self {
52            pb.set_message(msg);
53        }
54    }
55
56    fn maybe_set_prefix(&self, prefix: impl Into<Cow<'static, str>>) {
57        if let Some(pb) = self {
58            pb.set_prefix(prefix);
59        }
60    }
61
62    fn maybe_set_position(&self, pos: u64) {
63        if let Some(pb) = self {
64            pb.set_position(pos);
65        }
66    }
67
68    fn maybe_per_sec(&self) -> f64 {
69        if let Some(pb) = self {
70            pb.per_sec()
71        }
72        else {
73            0.0
74        }
75    }
76}
77
78pub trait MaybeMultiProgress {
79    fn maybe_add(&self, pb: ProgressBar) -> Option<ProgressBar>;
80    #[allow(dead_code)]
81    fn maybe_insert_before(&self, before: Option<&ProgressBar>, pb: ProgressBar) -> Option<ProgressBar>;
82    #[allow(dead_code)]
83    fn maybe_insert_after(&self, after: Option<&ProgressBar>, pb: ProgressBar) -> Option<ProgressBar>;
84    fn maybe_insert_from_back(&self, index: usize, pb: ProgressBar) -> Option<ProgressBar>;
85    fn maybe_remove(&self, pb: Option<ProgressBar>);
86}
87
88impl MaybeMultiProgress for Option<MultiProgress> {
89    fn maybe_add(&self, pb: ProgressBar) -> Option<ProgressBar> {
90        self.as_ref().map(|mp| mp.add(pb))
91    }
92
93    fn maybe_insert_before(&self, before: Option<&ProgressBar>, pb: ProgressBar) -> Option<ProgressBar> {
94        self.as_ref().map(|mp| {
95            if let Some(before) = before {
96                mp.insert_before(before, pb)
97            }
98            else {
99                mp.add(pb)
100            }
101        })
102    }
103
104    fn maybe_insert_after(&self, after: Option<&ProgressBar>, pb: ProgressBar) -> Option<ProgressBar> {
105        if let Some(mp) = self {
106            if let Some(after) = after {
107                Some(mp.insert_after(after, pb))
108            }
109            else {
110                Some(mp.add(pb))
111            }
112        }
113        else {
114            None
115        }
116    }
117
118    fn maybe_insert_from_back(&self, index: usize, pb: ProgressBar) -> Option<ProgressBar> {
119        self.as_ref().map(|mp| mp.insert_from_back(index, pb))
120    }
121
122    fn maybe_remove(&self, pb: Option<ProgressBar>) {
123        if let Some(mp) = self {
124            if let Some(pb) = &pb {
125                mp.remove(pb);
126            }
127        }
128    }
129}