use std::net::SocketAddr;
use pb_mapper_core::config::ResolvedAddrs;
use uni_stream::addr::ToSocketAddrs;
pub(crate) async fn resolve_all<A: ToSocketAddrs>(addr: A) -> std::io::Result<ResolvedAddrs> {
let candidates: Vec<SocketAddr> = addr.to_socket_addrs().await?.collect();
ResolvedAddrs::from_candidates(candidates).ok_or_else(|| {
std::io::Error::new(
std::io::ErrorKind::InvalidInput,
"could not resolve to any addresses",
)
})
}
pub(crate) async fn resolve_tunnel_ends<A: ToSocketAddrs>(
local_addr: A,
remote_addr: A,
) -> Option<(ResolvedAddrs, ResolvedAddrs)> {
let local_addr = match resolve_all(local_addr).await {
Ok(addrs) => addrs,
Err(e) => {
tracing::error!("parse local addr failed: {e}");
return None;
}
};
let remote_addr = match resolve_all(remote_addr).await {
Ok(addrs) => addrs,
Err(e) => {
tracing::error!("parse remote addr failed: {e}");
return None;
}
};
Some((local_addr, remote_addr))
}