bgpkit_parser/models/network/
afi.rs

1use num_enum::{IntoPrimitive, TryFromPrimitive};
2use std::net::IpAddr;
3
4/// AFI -- Address Family Identifier
5///
6/// <https://www.iana.org/assignments/address-family-numbers/address-family-numbers.xhtml>
7#[derive(Debug, PartialEq, TryFromPrimitive, IntoPrimitive, Clone, Copy, Eq, Hash)]
8#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9#[repr(u16)]
10pub enum Afi {
11    Ipv4 = 1,
12    Ipv6 = 2,
13}
14
15impl From<IpAddr> for Afi {
16    #[inline]
17    fn from(value: IpAddr) -> Self {
18        match value {
19            IpAddr::V4(_) => Afi::Ipv4,
20            IpAddr::V6(_) => Afi::Ipv6,
21        }
22    }
23}
24
25/// SAFI -- Subsequent Address Family Identifier
26///
27/// SAFI can be: Unicast, Multicast, or both.
28#[derive(Debug, PartialEq, TryFromPrimitive, IntoPrimitive, Clone, Copy, Eq, Hash)]
29#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
30#[repr(u8)]
31pub enum Safi {
32    Unicast = 1,
33    Multicast = 2,
34    UnicastMulticast = 3,
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    #[test]
42    fn test_afi_from() {
43        assert_eq!(
44            Afi::from(IpAddr::V4(std::net::Ipv4Addr::new(127, 0, 0, 1))),
45            Afi::Ipv4
46        );
47        assert_eq!(
48            Afi::from(IpAddr::V6(std::net::Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1))),
49            Afi::Ipv6
50        );
51    }
52
53    #[test]
54    fn test_afi_safi_repr() {
55        assert_eq!(Afi::Ipv4 as u16, 1);
56        assert_eq!(Afi::Ipv6 as u16, 2);
57
58        assert_eq!(Safi::Unicast as u8, 1);
59        assert_eq!(Safi::Multicast as u8, 2);
60        assert_eq!(Safi::UnicastMulticast as u8, 3);
61    }
62
63    #[test]
64    #[cfg(feature = "serde")]
65    fn test_afi_safi_serde() {
66        let afi = Afi::Ipv4;
67        let serialized = serde_json::to_string(&afi).unwrap();
68        assert_eq!(serialized, "\"Ipv4\"");
69        let deserialized: Afi = serde_json::from_str(&serialized).unwrap();
70        assert_eq!(deserialized, afi);
71
72        let afi = Afi::Ipv6;
73        let serialized = serde_json::to_string(&afi).unwrap();
74        assert_eq!(serialized, "\"Ipv6\"");
75        let deserialized: Afi = serde_json::from_str(&serialized).unwrap();
76        assert_eq!(deserialized, afi);
77
78        let safi = Safi::Unicast;
79        let serialized = serde_json::to_string(&safi).unwrap();
80        assert_eq!(serialized, "\"Unicast\"");
81        let deserialized: Safi = serde_json::from_str(&serialized).unwrap();
82        assert_eq!(deserialized, safi);
83
84        let safi = Safi::Multicast;
85        let serialized = serde_json::to_string(&safi).unwrap();
86        assert_eq!(serialized, "\"Multicast\"");
87        let deserialized: Safi = serde_json::from_str(&serialized).unwrap();
88        assert_eq!(deserialized, safi);
89
90        let safi = Safi::UnicastMulticast;
91        let serialized = serde_json::to_string(&safi).unwrap();
92        assert_eq!(serialized, "\"UnicastMulticast\"");
93        let deserialized: Safi = serde_json::from_str(&serialized).unwrap();
94        assert_eq!(deserialized, safi);
95    }
96}