Skip to main content

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