chiark / gitweb /
support v6 private addresses
[hippotat.git] / src / types.rs
index ca40df004558c07e395934b75ab3a1350087ed32..bb4fffb0869ef13774f44a8b0322a7280e269b76 100644 (file)
@@ -11,7 +11,7 @@ pub enum LinkEnd { Server, Client }
 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 {
@@ -23,12 +23,21 @@ impl FromStr for ClientName {
   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)"))
+      }
+    )
   }
 }