@@ -59,12 +59,12 @@ impl<'a> Parser<'a> {
59
59
60
60
/// Run a parser, but fail if the entire input wasn't consumed.
61
61
/// Doesn't run atomically.
62
- fn parse_with < T , F > ( & mut self , inner : F ) -> Result < T , AddrParseError >
62
+ fn parse_with < T , F > ( & mut self , inner : F , kind : AddrKind ) -> Result < T , AddrParseError >
63
63
where
64
64
F : FnOnce ( & mut Parser < ' _ > ) -> Option < T > ,
65
65
{
66
66
let result = inner ( self ) ;
67
- if self . state . is_empty ( ) { result } else { None } . ok_or ( AddrParseError ( ( ) ) )
67
+ if self . state . is_empty ( ) { result } else { None } . ok_or ( AddrParseError ( kind ) )
68
68
}
69
69
70
70
/// Peek the next character from the input
@@ -278,7 +278,7 @@ impl<'a> Parser<'a> {
278
278
impl FromStr for IpAddr {
279
279
type Err = AddrParseError ;
280
280
fn from_str ( s : & str ) -> Result < IpAddr , AddrParseError > {
281
- Parser :: new ( s) . parse_with ( |p| p. read_ip_addr ( ) )
281
+ Parser :: new ( s) . parse_with ( |p| p. read_ip_addr ( ) , AddrKind :: Ip )
282
282
}
283
283
}
284
284
@@ -288,9 +288,9 @@ impl FromStr for Ipv4Addr {
288
288
fn from_str ( s : & str ) -> Result < Ipv4Addr , AddrParseError > {
289
289
// don't try to parse if too long
290
290
if s. len ( ) > 15 {
291
- Err ( AddrParseError ( ( ) ) )
291
+ Err ( AddrParseError ( AddrKind :: Ipv4 ) )
292
292
} else {
293
- Parser :: new ( s) . parse_with ( |p| p. read_ipv4_addr ( ) )
293
+ Parser :: new ( s) . parse_with ( |p| p. read_ipv4_addr ( ) , AddrKind :: Ipv4 )
294
294
}
295
295
}
296
296
}
@@ -299,34 +299,44 @@ impl FromStr for Ipv4Addr {
299
299
impl FromStr for Ipv6Addr {
300
300
type Err = AddrParseError ;
301
301
fn from_str ( s : & str ) -> Result < Ipv6Addr , AddrParseError > {
302
- Parser :: new ( s) . parse_with ( |p| p. read_ipv6_addr ( ) )
302
+ Parser :: new ( s) . parse_with ( |p| p. read_ipv6_addr ( ) , AddrKind :: Ipv6 )
303
303
}
304
304
}
305
305
306
306
#[ stable( feature = "socket_addr_from_str" , since = "1.5.0" ) ]
307
307
impl FromStr for SocketAddrV4 {
308
308
type Err = AddrParseError ;
309
309
fn from_str ( s : & str ) -> Result < SocketAddrV4 , AddrParseError > {
310
- Parser :: new ( s) . parse_with ( |p| p. read_socket_addr_v4 ( ) )
310
+ Parser :: new ( s) . parse_with ( |p| p. read_socket_addr_v4 ( ) , AddrKind :: SocketV4 )
311
311
}
312
312
}
313
313
314
314
#[ stable( feature = "socket_addr_from_str" , since = "1.5.0" ) ]
315
315
impl FromStr for SocketAddrV6 {
316
316
type Err = AddrParseError ;
317
317
fn from_str ( s : & str ) -> Result < SocketAddrV6 , AddrParseError > {
318
- Parser :: new ( s) . parse_with ( |p| p. read_socket_addr_v6 ( ) )
318
+ Parser :: new ( s) . parse_with ( |p| p. read_socket_addr_v6 ( ) , AddrKind :: SocketV6 )
319
319
}
320
320
}
321
321
322
322
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
323
323
impl FromStr for SocketAddr {
324
324
type Err = AddrParseError ;
325
325
fn from_str ( s : & str ) -> Result < SocketAddr , AddrParseError > {
326
- Parser :: new ( s) . parse_with ( |p| p. read_socket_addr ( ) )
326
+ Parser :: new ( s) . parse_with ( |p| p. read_socket_addr ( ) , AddrKind :: Socket )
327
327
}
328
328
}
329
329
330
+ #[ derive( Debug , Clone , PartialEq , Eq ) ]
331
+ enum AddrKind {
332
+ Ip ,
333
+ Ipv4 ,
334
+ Ipv6 ,
335
+ Socket ,
336
+ SocketV4 ,
337
+ SocketV6 ,
338
+ }
339
+
330
340
/// An error which can be returned when parsing an IP address or a socket address.
331
341
///
332
342
/// This error is used as the error type for the [`FromStr`] implementation for
@@ -353,7 +363,7 @@ impl FromStr for SocketAddr {
353
363
/// ```
354
364
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
355
365
#[ derive( Debug , Clone , PartialEq , Eq ) ]
356
- pub struct AddrParseError ( ( ) ) ;
366
+ pub struct AddrParseError ( AddrKind ) ;
357
367
358
368
#[ stable( feature = "addr_parse_error_error" , since = "1.4.0" ) ]
359
369
impl fmt:: Display for AddrParseError {
@@ -367,6 +377,13 @@ impl fmt::Display for AddrParseError {
367
377
impl Error for AddrParseError {
368
378
#[ allow( deprecated) ]
369
379
fn description ( & self ) -> & str {
370
- "invalid IP address syntax"
380
+ match self . 0 {
381
+ AddrKind :: Ip => "invalid IP address syntax" ,
382
+ AddrKind :: Ipv4 => "invalid IPv4 address syntax" ,
383
+ AddrKind :: Ipv6 => "invalid IPv6 address syntax" ,
384
+ AddrKind :: Socket => "invalid socket address syntax" ,
385
+ AddrKind :: SocketV4 => "invalid IPv4 socket address syntax" ,
386
+ AddrKind :: SocketV6 => "invalid IPv6 socket address syntax" ,
387
+ }
371
388
}
372
389
}
0 commit comments