1use std::net::{IpAddr, ToSocketAddrs};
2
3pub fn resolve(name: &str, only_ipv4: bool, only_ipv6: bool) -> Option<IpAddr> {
4
5 if let Ok(ip) = name.parse::<IpAddr>() {
6 if only_ipv4 && ip.is_ipv6() {
7 return None;
8 }
9 if only_ipv6 && ip.is_ipv4() {
10 return None;
11 }
12 return Some(ip);
13 }
14
15 let addrs: Vec<IpAddr> = match (name, 0u16).to_socket_addrs() {
16 Ok(iter) => iter.map(|sa| sa.ip()).collect(),
17 Err(_) => return None,
18 };
19
20 if only_ipv6 {
21 addrs.iter().find(|a| a.is_ipv6()).copied()
22 } else if only_ipv4 {
23 addrs.iter().find(|a| a.is_ipv4()).copied()
24 } else {
25 addrs.iter().find(|a| a.is_ipv4()).copied()
26 .or_else(|| addrs.first().copied())
27 }
28}