1use serde::Serialize;
2
3#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize)]
5pub struct Metrics {
6 success: usize,
7 error: usize,
8}
9
10impl Metrics {
11 pub const fn new(success: usize, error: usize) -> Self {
13 Self { success, error }
14 }
15
16 pub const fn success(&self) -> usize {
18 self.success
19 }
20
21 pub const fn error(&self) -> usize {
23 self.error
24 }
25
26 pub const fn total(&self) -> usize {
28 self.success + self.error
29 }
30
31 pub const fn has_error(&self) -> bool {
33 self.error > 0
34 }
35
36 pub const fn add(&mut self, error: bool) {
38 if error {
39 self.error += 1;
40 } else {
41 self.success += 1;
42 }
43 }
44
45 pub const fn merge(&mut self, other: &Self) {
47 self.success += other.success;
48 self.error += other.error;
49 }
50}
51
52#[cfg(test)]
53mod tests {
54 use super::*;
55 use pretty_assertions::assert_eq;
56
57 #[test]
58 fn values() {
59 assert_eq!(Metrics::new(42, 7).success(), 42);
60 assert_eq!(Metrics::new(42, 7).error(), 7);
61 assert_eq!(Metrics::new(42, 7).total(), 49);
62 }
63
64 #[test]
65 fn add() {
66 let mut metrics = Metrics::default();
67
68 metrics.add(false);
69 assert_eq!(metrics, Metrics::new(1, 0));
70 metrics.add(true);
71 assert_eq!(metrics, Metrics::new(1, 1));
72 }
73
74 #[test]
75 fn has_error() {
76 assert!(!Metrics::default().has_error());
77 assert!(!Metrics::new(1, 0).has_error());
78 assert!(Metrics::new(0, 1).has_error());
79 }
80}