use std::net::{IpAddr, SocketAddr, ToSocketAddrs};
use std::time::{Duration, SystemTime, UNIX_EPOCH};
use rand::Rng;
use crate::error::ParsingError;
pub fn rand_int31() -> u32 {
rand::rng().random_range(0..=i32::MAX) as u32
}
pub fn now_as_duration() -> Duration {
SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("time went backwards")
}
pub fn now_as_secs() -> u64 {
now_as_duration().as_secs()
}
pub fn resolve_host(host: &str) -> Result<SocketAddr, ParsingError> {
let mut addrs = host.to_socket_addrs().map_err(ParsingError::ToSocketAddr)?;
match addrs.next() {
Some(addr) => Ok(addr),
None => Err(ParsingError::ToSocketAddr(std::io::Error::new(
std::io::ErrorKind::AddrNotAvailable,
format!("failed to parse address: {host}"),
))),
}
}
pub fn addr_is_reserved(socket_addr: &SocketAddr) -> bool {
match socket_addr.ip() {
IpAddr::V4(v4) => {
v4.is_loopback()
|| v4.is_private()
|| v4.is_link_local()
|| v4.is_unspecified()
}
IpAddr::V6(v6) => {
v6.is_loopback()
}
}
}