From 2ecf7c4cddb795da5a71255fb143f7ce3f524253 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Thu, 24 Mar 2022 00:15:29 +0000 Subject: [PATCH] Add IpAddress helper trait Signed-off-by: Ian Jackson --- src/prelude.rs | 1 + src/utils.rs | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/prelude.rs b/src/prelude.rs index 94bbb63f..40619ba5 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -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; diff --git a/src/utils.rs b/src/utils.rs index 6cf8de30..faf4cf49 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -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 IpAddress for A where A: Into + 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)?; } -- 2.30.2