use std::{ convert::Infallible, fmt::Display, net::{IpAddr, Ipv4Addr, Ipv6Addr}, str::FromStr, }; pub mod netlink; pub mod tmux; #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum Host { IpAddr(IpAddr), Hostname(String), } impl FromStr for Host { type Err = Infallible; fn from_str(s: &str) -> Result { Ok(IpAddr::from_str(s).map_or_else(|_| s.to_string().into(), Host::from)) } } impl From for Host { fn from(value: IpAddr) -> Self { match dns_lookup::lookup_addr(&value) { Ok(s) => Self::Hostname(s), Err(_) => Self::IpAddr(value), } } } impl From for Host { fn from(value: Ipv4Addr) -> Self { IpAddr::from(value).into() } } impl From for Host { fn from(value: Ipv6Addr) -> Self { IpAddr::from(value).into() } } impl From for Host { fn from(value: String) -> Self { Self::Hostname(value) } } impl Display for Host { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Host::IpAddr(i) => write!(f, "{}", i), Host::Hostname(s) => write!(f, "{}", s), } } }