use super::{TransportAddr, TransportError};
use std::net::SocketAddr;
pub(crate) async fn resolve_socket_addr(
addr: &TransportAddr,
) -> Result<SocketAddr, TransportError> {
resolve_socket_addrs(addr)
.await?
.into_iter()
.next()
.ok_or_else(|| {
TransportError::InvalidAddress(format!(
"DNS resolution returned no addresses for {}",
addr.as_str().unwrap_or("<non-utf8>")
))
})
}
pub(crate) async fn resolve_socket_addrs(
addr: &TransportAddr,
) -> Result<Vec<SocketAddr>, TransportError> {
let s = addr
.as_str()
.ok_or_else(|| TransportError::InvalidAddress("not valid UTF-8".into()))?;
if let Ok(sock_addr) = s.parse::<SocketAddr>() {
return Ok(vec![sock_addr]);
}
let addrs = tokio::net::lookup_host(s)
.await
.map_err(|e| {
TransportError::InvalidAddress(format!("DNS resolution failed for {}: {}", s, e))
})?
.collect::<Vec<_>>();
if addrs.is_empty() {
return Err(TransportError::InvalidAddress(format!(
"DNS resolution returned no addresses for {}",
s
)));
}
Ok(addrs)
}