pub struct ServerName(pub String);
#[derive(Debug,Clone,Copy,Hash,Eq,PartialEq,Ord,PartialOrd)]
-pub struct ClientName(pub Ipv4Addr);
+pub struct ClientName(pub IpAddr);
#[derive(Debug,Clone,Hash,Eq,PartialEq,Ord,PartialOrd)]
pub struct LinkName {
type Err = AE;
#[throws(AE)]
fn from_str(s: &str) -> Self {
- let v4addr: Ipv4Addr = s.parse()
- .context("invalid client name (IPv4 address)")?;
- if s != v4addr.to_string() {
- throw!(anyhow!("invalid client name (unusual IPv4 address syntax)"));
- }
- ClientName(v4addr)
+ ClientName(
+ if let Ok(v4addr) = s.parse::<Ipv4Addr>() {
+ if s != v4addr.to_string() {
+ throw!(anyhow!("invalid client name (unusual IPv4 address syntax)"));
+ }
+ v4addr.into()
+ } else if let Ok(v6addr) = s.parse::<Ipv6Addr>() {
+ if s != v6addr.to_string() {
+ throw!(anyhow!("invalid client name (non-canonical IPv6 address)"));
+ }
+ v6addr.into()
+ } else {
+ throw!(anyhow!("invalid client name (IPv4 or IPv6 address)"))
+ }
+ )
}
}