muffy/
metrics.rs

1use serde::Serialize;
2
3/// Validation metrics.
4#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize)]
5pub struct Metrics {
6    success: usize,
7    error: usize,
8}
9
10impl Metrics {
11    /// Creates metrics.
12    pub const fn new(success: usize, error: usize) -> Self {
13        Self { success, error }
14    }
15
16    /// Returns a number of successes.
17    pub const fn success(&self) -> usize {
18        self.success
19    }
20
21    /// Returns a number of errors.
22    pub const fn error(&self) -> usize {
23        self.error
24    }
25
26    /// Returns a total number of successes and errors.
27    pub const fn total(&self) -> usize {
28        self.success + self.error
29    }
30
31    /// Returns `true` if metrics has errors, or `false` otherwise.
32    pub const fn has_error(&self) -> bool {
33        self.error > 0
34    }
35
36    /// Adds a success or error.
37    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    /// Merges two metrics.
46    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}