bgpkit_parser/models/bgp/attributes/
origin.rs

1use num_enum::{IntoPrimitive, TryFromPrimitive};
2use std::fmt::{Display, Formatter};
3
4#[allow(non_camel_case_types)]
5#[derive(Debug, TryFromPrimitive, IntoPrimitive, PartialEq, Eq, Hash, Copy, Clone)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7#[repr(u8)]
8pub enum Origin {
9    /// Interior Gateway Protocol
10    IGP = 0,
11    /// Exterior Gateway Protocol
12    /// <https://datatracker.ietf.org/doc/html/rfc904>
13    EGP = 1,
14    INCOMPLETE = 2,
15}
16
17impl Display for Origin {
18    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
19        match self {
20            Origin::IGP => write!(f, "IGP"),
21            Origin::EGP => write!(f, "EGP"),
22            Origin::INCOMPLETE => write!(f, "INCOMPLETE"),
23        }
24    }
25}
26
27#[cfg(test)]
28mod tests {
29    use super::*;
30
31    #[test]
32    #[cfg(feature = "serde")]
33    fn test_serde() {
34        use serde_json;
35
36        let origin = Origin::IGP;
37        let serialized = serde_json::to_string(&origin).unwrap();
38        let deserialized: Origin = serde_json::from_str(&serialized).unwrap();
39        assert_eq!(origin, deserialized);
40
41        let origin = Origin::EGP;
42        let serialized = serde_json::to_string(&origin).unwrap();
43        let deserialized: Origin = serde_json::from_str(&serialized).unwrap();
44        assert_eq!(origin, deserialized);
45
46        let origin = Origin::INCOMPLETE;
47        let serialized = serde_json::to_string(&origin).unwrap();
48        let deserialized: Origin = serde_json::from_str(&serialized).unwrap();
49        assert_eq!(origin, deserialized);
50    }
51
52    #[test]
53    fn test_display() {
54        let origin = Origin::IGP;
55        assert_eq!(format!("{origin}"), "IGP");
56        let origin = Origin::EGP;
57        assert_eq!(format!("{origin}"), "EGP");
58        let origin = Origin::INCOMPLETE;
59        assert_eq!(format!("{origin}"), "INCOMPLETE");
60    }
61}