From: Ian Jackson Date: Thu, 24 Mar 2022 00:15:29 +0000 (+0000) Subject: Add IpAddress helper trait X-Git-Tag: otter-1.0.0~130 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=2ecf7c4cddb795da5a71255fb143f7ce3f524253;p=otter.git Add IpAddress helper trait Signed-off-by: Ian Jackson --- 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)?; }