wb_cache/test/simulation/progress/
traits.rs1use 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}