chiark / gitweb /
Add IpAddress helper trait
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 24 Mar 2022 00:15:29 +0000 (00:15 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 27 Mar 2022 22:03:22 +0000 (23:03 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/prelude.rs
src/utils.rs

index 94bbb63fbe93a59e38b5851f3896e5cf48319cc4..40619ba58dc65c1c9102a33b0e2b9876a6b3ffde 100644 (file)
@@ -40,6 +40,7 @@ pub use std::os::unix::fs::{MetadataExt, OpenOptionsExt};
 pub use std::os::unix::io::{AsRawFd, IntoRawFd, RawFd};
 pub use std::os::unix::net::UnixStream;
 pub use std::os::unix::process::{CommandExt, ExitStatusExt};
+pub use std::net::{IpAddr, SocketAddr, ToSocketAddrs};
 pub use std::path::PathBuf;
 pub use std::process::{exit, Child, Command, Stdio};
 pub use std::str;
index 6cf8de306df9f8f358c180fac72a4cda4fd4ac59..faf4cf49c918ab268fdbeade4ffc68ca59b4006e 100644 (file)
@@ -738,6 +738,21 @@ impl Drop for CookedStdout {
   fn drop(&mut self) { self.must_flush() }
 }
 
+pub trait IpAddress {
+  fn with_port(&self, port: u16) -> SocketAddr;
+}
+
+impl<A> IpAddress for A where A: Into<IpAddr> + Debug + Clone {
+  fn with_port(&self, port: u16) -> SocketAddr {
+    match (self.clone().into(), port)
+      .to_socket_addrs()
+      .map(|i| i.at_most_one()) {
+        Ok(Ok(Some(addr))) => addr,
+        x => panic!("{:?},{} gave {:?}", self, port, x),
+      }
+  }
+}
+
 #[throws(fmt::Error)]
 pub fn fmt_hex(f: &mut Formatter, buf: &[u8]) {
   for v in buf { write!(f, "{:02x}", v)?; }