use crate::{Authority, AuthorityRef, SocketAddress, SocketAddressV4};
impl SocketAddressV4 {
pub const fn to_socket(self) -> SocketAddress {
SocketAddress::new(self.ip().to_ip(), self.port())
}
pub const fn to_authority(self) -> Authority {
Authority::new(self.ip().to_host(), self.port())
}
pub const fn to_authority_ref(self) -> AuthorityRef<'static> {
AuthorityRef::new(self.ip().to_host_ref(), self.port())
}
}
impl TryFrom<SocketAddress> for SocketAddressV4 {
type Error = SocketAddress;
fn try_from(socket: SocketAddress) -> Result<Self, Self::Error> {
socket.to_v4()
}
}
#[cfg(test)]
mod tests {
use crate::{
Authority, AuthorityRef, Host, HostRef, IPAddress, IPv4Address, IPv6Address, SocketAddress,
SocketAddressV4,
};
#[test]
fn v4_to_socket() {
let socket: SocketAddressV4 = IPv4Address::LOCALHOST.to_socket(80);
let result: SocketAddress = socket.to_socket();
let expected: SocketAddress = SocketAddress::new(IPAddress::V4(IPv4Address::LOCALHOST), 80);
assert_eq!(result, expected);
}
#[test]
fn v4_to_authority() {
let socket: SocketAddressV4 = IPv4Address::LOCALHOST.to_socket(80);
let result: Authority = socket.to_authority();
let expected: Authority =
Authority::new(Host::IPAddress(IPAddress::V4(IPv4Address::LOCALHOST)), 80);
assert_eq!(result, expected);
let result: AuthorityRef = socket.to_authority_ref();
let expected: AuthorityRef = AuthorityRef::new(
HostRef::IPAddress(IPAddress::V4(IPv4Address::LOCALHOST)),
80,
);
assert_eq!(result, expected);
}
#[test]
fn v4_try_from() {
let socket: SocketAddress = IPv4Address::LOCALHOST.to_ip().to_socket(80);
let expected: SocketAddressV4 = IPv4Address::LOCALHOST.to_socket(80);
assert_eq!(SocketAddressV4::try_from(socket), Ok(expected));
let socket: SocketAddress = IPv6Address::LOCALHOST.to_ip().to_socket(80);
assert_eq!(SocketAddressV4::try_from(socket), Err(socket));
}
}