hickory_proto/rr/domain/
try_parse_ip.rs1use std::net::IpAddr;
9
10use crate::rr::{Name, RData};
11
12pub trait TryParseIp {
14 fn try_parse_ip(&self) -> Option<RData>;
16}
17
18impl TryParseIp for str {
19 fn try_parse_ip(&self) -> Option<RData> {
20 match self.parse::<IpAddr>() {
21 Ok(IpAddr::V4(ip4)) => Ok(RData::A(ip4.into())),
22 Ok(IpAddr::V6(ip6)) => Ok(RData::AAAA(ip6.into())),
23 Err(err) => Err(err),
24 }
25 .ok()
26 }
27}
28
29impl TryParseIp for String {
30 fn try_parse_ip(&self) -> Option<RData> {
31 (self[..]).try_parse_ip()
32 }
33}
34
35impl TryParseIp for Name {
36 fn try_parse_ip(&self) -> Option<RData> {
38 None
39 }
40}
41
42impl<T> TryParseIp for &T
43where
44 T: TryParseIp + ?Sized,
45{
46 fn try_parse_ip(&self) -> Option<RData> {
47 TryParseIp::try_parse_ip(*self)
48 }
49}
50
51#[test]
52fn test_try_parse_ip() {
53 use std::net::{Ipv4Addr, Ipv6Addr};
54
55 assert_eq!(
56 "127.0.0.1".try_parse_ip().expect("failed"),
57 RData::A(Ipv4Addr::new(127, 0, 0, 1).into())
58 );
59
60 assert_eq!(
61 "::1".try_parse_ip().expect("failed"),
62 RData::AAAA(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1).into())
63 );
64
65 assert!("example.com".try_parse_ip().is_none());
66}