#[cfg(all(feature = "std", target_arch = "wasm32"))]
use web_time::SystemTime;
#[cfg(all(feature = "std", not(target_arch = "wasm32")))]
use std::time::SystemTime;
use core::net::{
AddrParseError, IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6,
};
use core::{iter, option, slice};
#[cfg(feature = "std")]
pub(crate) fn now() -> Result<u64, super::Error> {
Ok(SystemTime::now()
.duration_since(SystemTime::UNIX_EPOCH)?
.as_secs())
}
#[cfg(not(feature = "std"))]
pub(crate) fn now() -> Result<u64, super::Error> {
Ok(0)
}
pub trait ToSocketAddrs {
type Iter: Iterator<Item = SocketAddr>;
fn to_socket_addrs(&self) -> Result<Self::Iter, AddrParseError>;
}
impl ToSocketAddrs for SocketAddr {
type Iter = option::IntoIter<SocketAddr>;
fn to_socket_addrs(&self) -> Result<option::IntoIter<SocketAddr>, AddrParseError> {
Ok(Some(*self).into_iter())
}
}
impl ToSocketAddrs for SocketAddrV4 {
type Iter = option::IntoIter<SocketAddr>;
fn to_socket_addrs(&self) -> Result<option::IntoIter<SocketAddr>, AddrParseError> {
SocketAddr::V4(*self).to_socket_addrs()
}
}
impl ToSocketAddrs for SocketAddrV6 {
type Iter = option::IntoIter<SocketAddr>;
fn to_socket_addrs(&self) -> Result<option::IntoIter<SocketAddr>, AddrParseError> {
SocketAddr::V6(*self).to_socket_addrs()
}
}
impl ToSocketAddrs for (IpAddr, u16) {
type Iter = option::IntoIter<SocketAddr>;
fn to_socket_addrs(&self) -> Result<option::IntoIter<SocketAddr>, AddrParseError> {
let (ip, port) = *self;
match ip {
IpAddr::V4(ref a) => (*a, port).to_socket_addrs(),
IpAddr::V6(ref a) => (*a, port).to_socket_addrs(),
}
}
}
impl ToSocketAddrs for (Ipv4Addr, u16) {
type Iter = option::IntoIter<SocketAddr>;
fn to_socket_addrs(&self) -> Result<option::IntoIter<SocketAddr>, AddrParseError> {
let (ip, port) = *self;
SocketAddrV4::new(ip, port).to_socket_addrs()
}
}
impl ToSocketAddrs for (Ipv6Addr, u16) {
type Iter = option::IntoIter<SocketAddr>;
fn to_socket_addrs(&self) -> Result<option::IntoIter<SocketAddr>, AddrParseError> {
let (ip, port) = *self;
SocketAddrV6::new(ip, port, 0, 0).to_socket_addrs()
}
}
impl<'a> ToSocketAddrs for &'a [SocketAddr] {
type Iter = iter::Cloned<slice::Iter<'a, SocketAddr>>;
fn to_socket_addrs(&self) -> Result<Self::Iter, AddrParseError> {
Ok(self.iter().cloned())
}
}
impl ToSocketAddrs for &str {
type Iter = option::IntoIter<SocketAddr>;
fn to_socket_addrs(&self) -> Result<Self::Iter, AddrParseError> {
let addr = self.parse::<SocketAddr>()?;
Ok(Some(addr).into_iter())
}
}
impl<T: ToSocketAddrs + ?Sized> ToSocketAddrs for &T {
type Iter = T::Iter;
fn to_socket_addrs(&self) -> Result<T::Iter, AddrParseError> {
(**self).to_socket_addrs()
}
}