1+ use std:: future:: Future ;
12use std:: mem;
23use std:: net:: { IpAddr , Ipv4Addr , Ipv6Addr } ;
34use std:: net:: { SocketAddr , SocketAddrV4 , SocketAddrV6 } ;
45use std:: pin:: Pin ;
5- use std:: future:: Future ;
66
77use crate :: io;
88use crate :: task:: { spawn_blocking, Context , JoinHandle , Poll } ;
9+ use crate :: utils:: Context as ErrorContext ;
910
1011cfg_not_docs ! {
1112 macro_rules! ret {
@@ -67,6 +68,18 @@ pub enum ToSocketAddrsFuture<I> {
6768 Done ,
6869}
6970
71+ /// Wrap `std::io::Error` with additional message
72+ ///
73+ /// Keeps the original error kind and stores the original I/O error as `source`.
74+ impl < T > ErrorContext for ToSocketAddrsFuture < T > {
75+ fn context ( self , message : impl Fn ( ) -> String ) -> Self {
76+ match self {
77+ ToSocketAddrsFuture :: Ready ( res) => ToSocketAddrsFuture :: Ready ( res. context ( message) ) ,
78+ x => x,
79+ }
80+ }
81+ }
82+
7083impl < I : Iterator < Item = SocketAddr > > Future for ToSocketAddrsFuture < I > {
7184 type Output = io:: Result < I > ;
7285
@@ -110,7 +123,9 @@ impl ToSocketAddrs for SocketAddrV4 {
110123 impl Future <Output = Self :: Iter >,
111124 ToSocketAddrsFuture <Self :: Iter >
112125 ) {
113- SocketAddr :: V4 ( * self ) . to_socket_addrs ( )
126+ SocketAddr :: V4 ( * self )
127+ . to_socket_addrs ( )
128+ . context ( || format ! ( "could not resolve address `{}`" , self ) )
114129 }
115130}
116131
@@ -123,7 +138,9 @@ impl ToSocketAddrs for SocketAddrV6 {
123138 impl Future <Output = Self :: Iter >,
124139 ToSocketAddrsFuture <Self :: Iter >
125140 ) {
126- SocketAddr :: V6 ( * self ) . to_socket_addrs ( )
141+ SocketAddr :: V6 ( * self )
142+ . to_socket_addrs ( )
143+ . context ( || format ! ( "could not resolve address `{}`" , self ) )
127144 }
128145}
129146
@@ -195,7 +212,9 @@ impl ToSocketAddrs for (&str, u16) {
195212
196213 let host = host. to_string ( ) ;
197214 let task = spawn_blocking ( move || {
198- std:: net:: ToSocketAddrs :: to_socket_addrs ( & ( host. as_str ( ) , port) )
215+ let addr = ( host. as_str ( ) , port) ;
216+ std:: net:: ToSocketAddrs :: to_socket_addrs ( & addr)
217+ . context ( || format ! ( "could not resolve address `{:?}`" , addr) )
199218 } ) ;
200219 ToSocketAddrsFuture :: Resolving ( task)
201220 }
@@ -215,7 +234,10 @@ impl ToSocketAddrs for str {
215234 }
216235
217236 let addr = self . to_string ( ) ;
218- let task = spawn_blocking ( move || std:: net:: ToSocketAddrs :: to_socket_addrs ( addr. as_str ( ) ) ) ;
237+ let task = spawn_blocking ( move || {
238+ std:: net:: ToSocketAddrs :: to_socket_addrs ( addr. as_str ( ) )
239+ . context ( || format ! ( "could not resolve address `{:?}`" , addr) )
240+ } ) ;
219241 ToSocketAddrsFuture :: Resolving ( task)
220242 }
221243}
0 commit comments