ping_command/
events.rs

1use crate::event::Event;
2use crate::round_trip_statistics::RoundTripStatistics;
3// use numeric_statistics::f64::{min::*, max::*, average::*, variance::*, standard_deviation::*};
4
5#[derive(Debug, Clone)]
6pub struct Events {
7    pub vec: Vec<Event>,
8}
9
10impl Events {
11    pub fn new() -> Self {
12        Events {
13            vec: Vec::new(),
14        }
15    }
16
17    // TODO memoize
18    pub fn attempt_count(&self) -> usize {
19        self.vec.len()
20    }
21
22    // TODO memoize
23    pub fn success_count(&self) -> usize {
24        self.vec.iter().filter(|x| x.success).count()
25    }
26
27    // TODO memoize
28    pub fn failure_count(&self) -> usize {
29        self.vec.iter().filter(|x| !x.success).count()
30    }
31
32    // TODO memoize
33    pub fn success_rate(&self) -> f64 {
34        if self.attempt_count() == 0 { return f64::NAN }
35        self.success_count() as f64 / self.attempt_count() as f64
36    }
37
38    pub fn success_round_trip_statistics(&self) -> Vec<RoundTripStatistics> {
39        self
40            .vec
41            .iter()
42            .filter(|x| x.success)
43            .filter_map(|x| x.round_trip_statistics )
44            .collect::<Vec<_>>()
45    }
46
47}
48
49use std::fmt;
50impl fmt::Display for Events {
51    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
52        write!(
53            f, 
54            concat!(
55                "attempt count: {}\n",
56                "success count: {}\n",
57                "success rate: {}",
58            ),
59            self.attempt_count(),
60            self.success_count(),
61            self.success_rate(),
62        )
63    }
64}