address 0.20.0-rc.2

Network address types with strict validation, owned & borrowed variants, and standard library conversions.
use crate::{AuthorityRef, SocketAddress, SocketAddressV4, SocketAddressV6};
use std::net::{SocketAddr, SocketAddrV4, SocketAddrV6};

impl<'a> From<SocketAddr> for AuthorityRef<'a> {
    /// The `flow_info` & `scope_id` are discarded for IPv6 socket addresses.
    fn from(socket: SocketAddr) -> Self {
        Self::from(SocketAddress::from(socket))
    }
}

impl<'a> From<SocketAddrV4> for AuthorityRef<'a> {
    fn from(socket: SocketAddrV4) -> Self {
        Self::from(SocketAddressV4::from(socket))
    }
}

impl<'a> From<SocketAddrV6> for AuthorityRef<'a> {
    /// The `flow_info` & `scope_id` are discarded.
    fn from(socket: SocketAddrV6) -> Self {
        Self::from(SocketAddressV6::from(socket))
    }
}

#[cfg(test)]
mod tests {
    use crate::{AuthorityRef, IPv4Address, IPv6Address};
    use std::net::{SocketAddr, SocketAddrV4, SocketAddrV6};

    #[test]
    fn ref_from() {
        let expected: AuthorityRef = AuthorityRef::new(IPv4Address::LOCALHOST.to_host_ref(), 80);

        let socket: SocketAddr = IPv4Address::LOCALHOST.to_ip().to_socket(80).to_std();
        let result: AuthorityRef = socket.into();
        assert_eq!(result, expected);

        let socket: SocketAddrV4 = IPv4Address::LOCALHOST.to_socket(80).into();
        let result: AuthorityRef = socket.into();
        assert_eq!(result, expected);

        let expected: AuthorityRef = AuthorityRef::new(IPv6Address::LOCALHOST.to_host_ref(), 80);

        let socket: SocketAddrV6 = IPv6Address::LOCALHOST.to_socket(80).into();
        let result: AuthorityRef = socket.into();
        assert_eq!(result, expected);
    }
}