1pub trait Reporter: Clone + Send + Sync {
9 #[must_use]
13 fn fork(&self) -> Self {
14 self.to_owned()
15 }
16
17 #[must_use]
19 fn sub(&self) -> Self {
20 self.fork()
21 }
22
23 fn send(&self, state: ReportState);
25
26 fn send_mut(&mut self, state: ReportState) {
30 self.send(state)
31 }
32}
33
34pub(crate) trait Progress: Reporter {
35 fn set_message(&self, msg: String) {
36 self.send(ReportState::SetMessage(msg));
37 }
38 fn set_sub_message(&self, msg: String) {
39 self.send(ReportState::SetSubMessage(msg));
40 }
41 fn set_max_progress(&self, value: f64) {
42 self.send(ReportState::SetMaxProgress(value));
43 }
44 fn add_max_progress(&self, value: f64) {
45 self.send(ReportState::AddMaxProgress(value));
46 }
47 fn set_progress(&self, value: f64) {
48 self.send(ReportState::SetProgress(value));
49 }
50 fn add_progress(&self, value: f64) {
51 self.send(ReportState::AddProgress(value));
52 }
53 fn set_indeterminate_progress(&self) {
54 self.send(ReportState::SetIndeterminateProgress);
55 }
56 fn hide_progress(&self) {
57 self.send(ReportState::SetIndeterminateProgress);
58 }
59 fn remove_progress(self) {
60 self.send(ReportState::RemoveProgress);
61 }
62}
63
64impl<R: Reporter> Reporter for Option<R> {
65 fn fork(&self) -> Self {
66 self.as_ref().map(|s| s.fork())
67 }
68
69 fn sub(&self) -> Self {
70 self.as_ref().map(|s| s.sub())
71 }
72
73 fn send(&self, state: ReportState) {
74 if let Some(s) = &self {
75 s.send(state);
76 }
77 }
78
79 fn send_mut(&mut self, state: ReportState) {
80 if let Some(s) = self {
81 s.send_mut(state);
82 }
83 }
84}
85
86impl<R: Reporter> Progress for R {}
87
88pub const NR: Option<()> = None;
90
91impl Reporter for () {
92 fn send(&self, _: ReportState) {}
93}
94
95#[derive(Debug, Clone)]
97pub enum ReportState {
98 SetMessage(String),
100 SetSubMessage(String),
102 SetMaxProgress(f64),
104 AddMaxProgress(f64),
106 SetProgress(f64),
108 AddProgress(f64),
110 SetIndeterminateProgress,
112 HideProgress,
114 RemoveProgress,
116}