]>
Commit | Line | Data |
---|---|---|
2260f065 DM |
1 | #[derive(Debug, Default)] |
2 | /// Tracker for progress of operations iterating over `Datastore` contents. | |
3 | pub struct StoreProgress { | |
4 | /// Completed groups | |
5 | pub done_groups: u64, | |
6 | /// Total groups | |
7 | pub total_groups: u64, | |
8 | /// Completed snapshots within current group | |
9 | pub done_snapshots: u64, | |
10 | /// Total snapshots in current group | |
11 | pub group_snapshots: u64, | |
12 | } | |
13 | ||
14 | impl StoreProgress { | |
15 | pub fn new(total_groups: u64) -> Self { | |
16 | StoreProgress { | |
17 | total_groups, | |
18 | .. Default::default() | |
19 | } | |
20 | } | |
21 | ||
22 | /// Calculates an interpolated relative progress based on current counters. | |
23 | pub fn percentage(&self) -> f64 { | |
24 | let per_groups = (self.done_groups as f64) / (self.total_groups as f64); | |
25 | if self.group_snapshots == 0 { | |
26 | per_groups | |
27 | } else { | |
28 | let per_snapshots = (self.done_snapshots as f64) / (self.group_snapshots as f64); | |
29 | per_groups + (1.0 / self.total_groups as f64) * per_snapshots | |
30 | } | |
31 | } | |
32 | } | |
33 | ||
34 | impl std::fmt::Display for StoreProgress { | |
35 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { | |
8081e4aa FG |
36 | let current_group = if self.done_groups < self.total_groups { |
37 | self.done_groups + 1 | |
38 | } else { | |
39 | self.done_groups | |
40 | }; | |
41 | ||
2260f065 DM |
42 | if self.group_snapshots == 0 { |
43 | write!( | |
44 | f, | |
45 | "{:.2}% ({} of {} groups)", | |
46 | self.percentage() * 100.0, | |
47 | self.done_groups, | |
48 | self.total_groups, | |
49 | ) | |
50 | } else if self.total_groups == 1 { | |
51 | write!( | |
52 | f, | |
53 | "{:.2}% ({} of {} snapshots)", | |
54 | self.percentage() * 100.0, | |
55 | self.done_snapshots, | |
56 | self.group_snapshots, | |
57 | ) | |
8081e4aa FG |
58 | } else if self.done_snapshots == self.group_snapshots { |
59 | write!( | |
60 | f, | |
61 | "{:.2}% ({} of {} groups)", | |
62 | self.percentage() * 100.0, | |
63 | current_group, | |
64 | self.total_groups, | |
65 | ) | |
2260f065 DM |
66 | } else { |
67 | write!( | |
68 | f, | |
69 | "{:.2}% ({} of {} groups, {} of {} group snapshots)", | |
70 | self.percentage() * 100.0, | |
71 | self.done_groups, | |
72 | self.total_groups, | |
73 | self.done_snapshots, | |
74 | self.group_snapshots, | |
75 | ) | |
76 | } | |
77 | } | |
78 | } |