use crate::{Authority, IPAddress, SocketAddress, SocketAddressV4, SocketAddressV6};
impl SocketAddressV4 {
pub const fn to_socket(self) -> SocketAddress {
SocketAddress::new(self.ip().to_ip(), self.port())
}
}
impl SocketAddressV6 {
pub const fn to_socket(self) -> SocketAddress {
SocketAddress::new(self.ip().to_ip(), self.port())
}
}
impl SocketAddress {
#[must_use]
pub const fn to_v4(self) -> Option<SocketAddressV4> {
if let IPAddress::V4(v4) = self.ip() {
Some(SocketAddressV4::new(v4, self.port()))
} else {
None
}
}
#[must_use]
pub const fn to_v6(self) -> Option<SocketAddressV6> {
if let IPAddress::V6(v6) = self.ip() {
Some(SocketAddressV6::new(v6, self.port()))
} else {
None
}
}
pub const fn to_authority(self) -> Authority {
Authority::new(self.ip().to_host(), self.port())
}
}
#[cfg(test)]
mod tests {
use crate::{Authority, IPv4Address, IPv6Address, SocketAddress, SocketAddressV4, SocketAddressV6};
#[test]
fn v4_to_socket() {
let socket: SocketAddressV4 = IPv4Address::LOCALHOST.to_socket(80);
let result: SocketAddress = socket.to_socket();
let expected: SocketAddress = SocketAddress::new(IPv4Address::LOCALHOST.to_ip(), 80);
assert_eq!(result, expected);
}
#[test]
fn v6_to_socket() {
let socket: SocketAddressV6 = IPv6Address::LOCALHOST.to_socket(80);
let result: SocketAddress = socket.to_socket();
let expected: SocketAddress = SocketAddress::new(IPv6Address::LOCALHOST.to_ip(), 80);
assert_eq!(result, expected);
}
#[test]
fn socket_to_v4() {
let test_cases: &[(SocketAddress, Option<SocketAddressV4>)] = &[
(
IPv4Address::LOCALHOST.to_ip().to_socket(80),
Some(SocketAddressV4::new(IPv4Address::LOCALHOST, 80)),
),
(IPv6Address::LOCALHOST.to_ip().to_socket(80), None),
];
for (socket, expected) in test_cases {
let result: Option<SocketAddressV4> = socket.to_v4();
assert_eq!(result, *expected, "socket={:?}", socket);
}
}
#[test]
fn socket_to_v6() {
let test_cases: &[(SocketAddress, Option<SocketAddressV6>)] = &[
(IPv4Address::LOCALHOST.to_ip().to_socket(80), None),
(
IPv6Address::LOCALHOST.to_ip().to_socket(80),
Some(SocketAddressV6::new(IPv6Address::LOCALHOST, 80)),
),
];
for (socket, expected) in test_cases {
let result: Option<SocketAddressV6> = socket.to_v6();
assert_eq!(result, *expected, "socket={:?}", socket);
}
}
#[test]
fn socket_to_authority() {
let socket: SocketAddress = IPv4Address::LOCALHOST.to_socket(80).to_socket();
let result: Authority = socket.to_authority();
let expected: Authority = Authority::new(IPv4Address::LOCALHOST.to_host(), 80);
assert_eq!(result, expected);
}
}