route_verification_shared_struct/
stats.rs

1#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
2pub struct Counts {
3    pub lex_skip: usize,
4    pub syntax_err: usize,
5    pub unknown_lex_err: usize,
6    /// Unknown path attributes (the basic component of <filter>) when parsing.
7    pub parse_path_attr: usize,
8    /// Invalid name parsing AutNum.
9    pub parse_aut_num: usize,
10    /// Error parsing AS Set.
11    pub parse_as_set: usize,
12    /// Invalid name when parsing Route Set.
13    pub parse_route_set: usize,
14    /// Invalid name when parsing Peering Set.
15    pub parse_peering_set: usize,
16    /// Invalid name when parsing Filter Set.
17    pub parse_filter_set: usize,
18    /// Invalid routes when parsing AS Routes.
19    pub parse_as_route: usize,
20}
21
22impl std::ops::Add for Counts {
23    type Output = Counts;
24
25    fn add(self, rhs: Self) -> Self::Output {
26        Self {
27            lex_skip: self.lex_skip + rhs.lex_skip,
28            syntax_err: self.syntax_err + rhs.syntax_err,
29            unknown_lex_err: self.unknown_lex_err + rhs.unknown_lex_err,
30            parse_path_attr: self.parse_path_attr + rhs.parse_path_attr,
31            parse_aut_num: self.parse_aut_num + rhs.parse_aut_num,
32            parse_as_set: self.parse_as_set + rhs.parse_as_set,
33            parse_route_set: self.parse_route_set + rhs.parse_route_set,
34            parse_peering_set: self.parse_peering_set + rhs.parse_peering_set,
35            parse_filter_set: self.parse_filter_set + rhs.parse_filter_set,
36            parse_as_route: self.parse_as_route + rhs.parse_as_route,
37        }
38    }
39}
40
41impl std::fmt::Display for Counts {
42    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
43        let Self {
44            lex_skip,
45            syntax_err,
46            unknown_lex_err,
47            parse_path_attr,
48            parse_aut_num,
49            parse_as_set,
50            parse_route_set,
51            parse_peering_set,
52            parse_filter_set,
53            parse_as_route,
54        } = self;
55        [
56            (lex_skip, "skips during lexing"),
57            (syntax_err, "syntax errors"),
58            (unknown_lex_err, "unknown lex errors"),
59            (parse_path_attr, "unknown path attributes in filter"),
60            (parse_aut_num, "invalid AutNum names"),
61            (parse_as_set, "invalid names parsing AS Sets"),
62            (parse_route_set, "invalid Route Set names"),
63            (parse_peering_set, "invalid Peering Set names"),
64            (parse_filter_set, "invalid Filter Set names"),
65            (parse_as_route, "invalid AS Route"),
66        ]
67        .into_iter()
68        .filter(|(field, _)| **field > 0)
69        .enumerate()
70        .try_for_each(|(index, (field, desc))| {
71            if index > 0 {
72                f.write_fmt(format_args!(", {field} {desc}"))
73            } else {
74                f.write_fmt(format_args!("{field} {desc}"))
75            }
76        })
77    }
78}