diff --git a/lib/dnsbox-base/src/common_types/eui.rs b/lib/dnsbox-base/src/common_types/eui.rs index 1f1a512..29640fe 100644 --- a/lib/dnsbox-base/src/common_types/eui.rs +++ b/lib/dnsbox-base/src/common_types/eui.rs @@ -55,6 +55,16 @@ impl fmt::Debug for EUI48Addr { } } +impl std::str::FromStr for EUI48Addr { + type Err = failure::Error; + + fn from_str(s: &str) -> Result { + let mut buf = [0u8; 6]; + parse_eui_hyphens(&mut buf, s)?; + Ok(EUI48Addr(buf)) + } +} + impl DnsPacketData for EUI48Addr { fn deserialize(data: &mut Cursor) -> Result { let mut buf = [0u8; 6]; @@ -71,13 +81,9 @@ impl DnsPacketData for EUI48Addr { impl DnsTextData for EUI48Addr { fn dns_parse(_context: &DnsTextContext, data: &mut &str) -> Result { - let field = next_field(data)?; - let mut buf = [0u8; 6]; - parse_eui_hyphens(&mut buf, field)?; - Ok(EUI48Addr(buf)) + next_field(data)?.parse() } - // format might fail if there is no (known) text representation. fn dns_format(&self, f: &mut DnsTextFormatter) -> fmt::Result { write!(f, "{}", self) } @@ -110,6 +116,16 @@ impl fmt::Debug for EUI64Addr { } } +impl std::str::FromStr for EUI64Addr { + type Err = failure::Error; + + fn from_str(s: &str) -> Result { + let mut buf = [0u8; 8]; + parse_eui_hyphens(&mut buf, s)?; + Ok(EUI64Addr(buf)) + } +} + impl DnsPacketData for EUI64Addr { fn deserialize(data: &mut Cursor) -> Result { let mut buf = [0u8; 8]; @@ -126,13 +142,9 @@ impl DnsPacketData for EUI64Addr { impl DnsTextData for EUI64Addr { fn dns_parse(_context: &DnsTextContext, data: &mut &str) -> Result { - let field = next_field(data)?; - let mut buf = [0u8; 8]; - parse_eui_hyphens(&mut buf, field)?; - Ok(EUI64Addr(buf)) + next_field(data)?.parse() } - // format might fail if there is no (known) text representation. fn dns_format(&self, f: &mut DnsTextFormatter) -> fmt::Result { write!(f, "{}", self) } diff --git a/lib/dnsbox-base/src/records/powerdns_tests.rs b/lib/dnsbox-base/src/records/powerdns_tests.rs index ba12d06..784b551 100644 --- a/lib/dnsbox-base/src/records/powerdns_tests.rs +++ b/lib/dnsbox-base/src/records/powerdns_tests.rs @@ -775,22 +775,40 @@ fn test_SPF() { #[test] fn test_EUI48() { + use crate::common_types::EUI48Addr; + check( types::EUI48, "00-11-22-33-44-55", None, b"\x00\x11\x22\x33\x44\x55", ); + + assert_eq!( + "00-00-5e-00-53-2a".parse::().unwrap(), + EUI48Addr([0x00, 0x00, 0x5e, 0x00, 0x53, 0x2a]), + ); + + assert!("00-00-5e-00-53-".parse::().is_err()); } #[test] fn test_EUI64() { + use crate::common_types::EUI64Addr; + check( types::EUI64, "00-11-22-33-44-55-66-77", None, b"\x00\x11\x22\x33\x44\x55\x66\x77", ); + + assert_eq!( + "00-00-5e-ef-10-00-00-2a".parse::().unwrap(), + EUI64Addr([0x00, 0x00, 0x5e, 0xef, 0x10, 0x00, 0x00, 0x2a]), + ); + + assert!("00-00-5e-ef-10-00-00-".parse::().is_err()); } #[test]