interface_rs/interface/
family.rs1use std::error::Error;
2use std::fmt;
3use std::str::FromStr;
4
5#[derive(Debug, Clone, PartialEq)]
29pub enum Family {
30 Inet,
32 Inet6,
34 IpX,
36 Can,
38}
39
40impl fmt::Display for Family {
41 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
42 let family_str = match self {
43 Family::Inet => "inet",
44 Family::Inet6 => "inet6",
45 Family::IpX => "ipx",
46 Family::Can => "can",
47 };
48 write!(f, "{}", family_str)
49 }
50}
51
52impl FromStr for Family {
53 type Err = FamilyParseError;
54
55 fn from_str(s: &str) -> Result<Self, Self::Err> {
61 match s {
62 "inet" => Ok(Family::Inet),
63 "inet6" => Ok(Family::Inet6),
64 "ipx" => Ok(Family::IpX),
65 "can" => Ok(Family::Can),
66 _ => Err(FamilyParseError(s.to_string())),
67 }
68 }
69}
70
71#[derive(Debug, Clone)]
76pub struct FamilyParseError(pub String);
77
78impl fmt::Display for FamilyParseError {
79 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
80 write!(f, "Invalid family: {}", self.0)
81 }
82}
83
84impl Error for FamilyParseError {}
85
86#[cfg(test)]
87mod tests {
88 use super::*;
89
90 #[test]
91 fn test_family_from_str() {
92 assert_eq!(Family::from_str("inet").unwrap(), Family::Inet);
93 assert_eq!(Family::from_str("inet6").unwrap(), Family::Inet6);
94 assert_eq!(Family::from_str("ipx").unwrap(), Family::IpX);
95 assert_eq!(Family::from_str("can").unwrap(), Family::Can);
96 }
97
98 #[test]
99 fn test_family_from_str_invalid() {
100 let err = Family::from_str("invalid").unwrap_err();
101 assert_eq!(err.0, "invalid");
102 assert_eq!(err.to_string(), "Invalid family: invalid");
103 }
104
105 #[test]
106 fn test_family_display() {
107 assert_eq!(Family::Inet.to_string(), "inet");
108 assert_eq!(Family::Inet6.to_string(), "inet6");
109 assert_eq!(Family::IpX.to_string(), "ipx");
110 assert_eq!(Family::Can.to_string(), "can");
111 }
112
113 #[test]
114 fn test_family_roundtrip() {
115 for family in [Family::Inet, Family::Inet6, Family::IpX, Family::Can] {
116 let s = family.to_string();
117 let parsed: Family = s.parse().unwrap();
118 assert_eq!(parsed, family);
119 }
120 }
121}