use dns_lookup::lookup_host;
use log::info;
use std::net::IpAddr;
pub fn parse_host(host: &str) -> Result<IpAddr, String> {
if let Ok(ip_addr) = host.parse::<IpAddr>() {
return Ok(ip_addr);
}
let mut addrs = lookup_host(host).map_err(|e| format!("DNS lookup failed: {e}"))?;
let ip_addr = addrs
.next()
.ok_or_else(|| format!("Failed to resolve hostname: {host}"))?;
info!("Resolved hostname: {host} -> {}", ip_addr.to_string());
Ok(ip_addr)
}
pub fn parse_host_port(host_port: &str) -> Result<(IpAddr, u16), String> {
if host_port.starts_with('[') {
if let Some(pos) = host_port.find("]:") {
let host = &host_port[1..pos];
let port = host_port[pos + 2..].parse::<u16>()
.map_err(|_| format!("Invalid port in address: {}", host_port))?;
let ip_addr = parse_host(host)?;
return Ok((ip_addr, port));
}
}
if let Some(pos) = host_port.rfind(':') {
let host = &host_port[..pos];
let port = host_port[pos + 1..].parse::<u16>()
.map_err(|_| format!("Invalid port in address: {}", host_port))?;
let ip_addr = parse_host(host)?;
Ok((ip_addr, port))
} else {
let ip_addr = parse_host(host_port)?;
Ok((ip_addr, 0))
}
}