use anyhow::Context;
pub(crate) fn resolve(addr: Option<&str>, default: &str) -> anyhow::Result<std::net::SocketAddr> {
use std::net::ToSocketAddrs;
addr.unwrap_or(default)
.to_socket_addrs()
.context("invalid address")?
.next()
.context("no addresses resolved")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn resolves_socket_literal() {
let addr = resolve(Some("[::]:0"), "[::]:443").unwrap();
assert!(addr.ip().is_unspecified());
assert_eq!(addr.port(), 0);
}
#[test]
fn resolves_dns_hostname() {
let addr = resolve(Some("localhost:0"), "[::]:443").unwrap();
assert!(addr.ip().is_loopback());
assert_eq!(addr.port(), 0);
}
#[test]
fn falls_back_to_default() {
let addr = resolve(None, "127.0.0.1:1234").unwrap();
assert_eq!(addr.ip().to_string(), "127.0.0.1");
assert_eq!(addr.port(), 1234);
}
}