diff --git a/tokio/src/net/addr.rs b/tokio/src/net/addr.rs index 9b3cc2bcb5c..871c3cfeb86 100644 --- a/tokio/src/net/addr.rs +++ b/tokio/src/net/addr.rs @@ -1,8 +1,6 @@ use futures_util::future; use std::io; -use std::net::{IpAddr, SocketAddr}; -#[cfg(feature = "dns")] -use std::net::{Ipv4Addr, Ipv6Addr}; +use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6}; /// Convert or resolve without blocking to one or more `SocketAddr` values. /// @@ -31,6 +29,32 @@ impl sealed::ToSocketAddrsPriv for SocketAddr { } } +// ===== impl SocketAddrV4 ===== + +impl ToSocketAddrs for SocketAddrV4 {} + +impl sealed::ToSocketAddrsPriv for SocketAddrV4 { + type Iter = std::option::IntoIter; + type Future = ReadyFuture; + + fn to_socket_addrs(&self) -> Self::Future { + SocketAddr::V4(*self).to_socket_addrs() + } +} + +// ===== impl SocketAddrV6 ===== + +impl ToSocketAddrs for SocketAddrV6 {} + +impl sealed::ToSocketAddrsPriv for SocketAddrV6 { + type Iter = std::option::IntoIter; + type Future = ReadyFuture; + + fn to_socket_addrs(&self) -> Self::Future { + SocketAddr::V6(*self).to_socket_addrs() + } +} + // ===== impl str ===== #[cfg(feature = "dns")] @@ -64,17 +88,16 @@ impl sealed::ToSocketAddrsPriv for str { // ===== impl (&str, u16) ===== #[cfg(feature = "dns")] -impl ToSocketAddrs for (&'_ str, u16) {} +impl ToSocketAddrs for (&str, u16) {} #[cfg(feature = "dns")] -impl sealed::ToSocketAddrsPriv for (&'_ str, u16) { +impl sealed::ToSocketAddrsPriv for (&str, u16) { type Iter = sealed::OneOrMore; type Future = sealed::MaybeReady; fn to_socket_addrs(&self) -> Self::Future { use crate::blocking; use sealed::MaybeReady; - use std::net::{SocketAddrV4, SocketAddrV6}; let (host, port) = *self; @@ -115,6 +138,34 @@ impl sealed::ToSocketAddrsPriv for (IpAddr, u16) { } } +// ===== impl (Ipv4Addr, u16) ===== + +impl ToSocketAddrs for (Ipv4Addr, u16) {} + +impl sealed::ToSocketAddrsPriv for (Ipv4Addr, u16) { + type Iter = std::option::IntoIter; + type Future = ReadyFuture; + + fn to_socket_addrs(&self) -> Self::Future { + let (ip, port) = *self; + SocketAddrV4::new(ip, port).to_socket_addrs() + } +} + +// ===== impl (Ipv6Addr, u16) ===== + +impl ToSocketAddrs for (Ipv6Addr, u16) {} + +impl sealed::ToSocketAddrsPriv for (Ipv6Addr, u16) { + type Iter = std::option::IntoIter; + type Future = ReadyFuture; + + fn to_socket_addrs(&self) -> Self::Future { + let (ip, port) = *self; + SocketAddrV6::new(ip, port, 0, 0).to_socket_addrs() + } +} + // ===== impl String ===== #[cfg(feature = "dns")] @@ -130,11 +181,11 @@ impl sealed::ToSocketAddrsPriv for String { } } -// ===== impl &'_ impl ToSocketAddrs ===== +// ===== impl &impl ToSocketAddrs ===== -impl ToSocketAddrs for &'_ T {} +impl ToSocketAddrs for &T {} -impl sealed::ToSocketAddrsPriv for &'_ T +impl sealed::ToSocketAddrsPriv for &T where T: sealed::ToSocketAddrsPriv + ?Sized, {