@@ -5,10 +5,9 @@ Types/fns concerning Internet Protocol (IP), versions 4 & 6
5
5
import vec;
6
6
import uint;
7
7
8
- export ip_addr;
8
+ export ip_addr, parse_addr_err ;
9
9
export format_addr;
10
10
export v4;
11
- //format_addr, parse_addr;
12
11
13
12
#[ doc = "An IP address" ]
14
13
enum ip_addr {
@@ -17,6 +16,13 @@ enum ip_addr {
17
16
ipv6( u16 , u16 , u16 , u16 , u16 , u16 , u16 , u16 )
18
17
}
19
18
19
+ #[ doc="
20
+ Human-friendly feedback on why a parse_addr attempt failed
21
+ " ]
22
+ type parse_addr_err = {
23
+ err_msg : str
24
+ } ;
25
+
20
26
#[ doc="
21
27
Convert a `ip_addr` to a str
22
28
@@ -29,7 +35,7 @@ fn format_addr(ip: ip_addr) -> str {
29
35
ipv4( a, b, c, d) {
30
36
#fmt[ "%u.%u.%u.%u" , a as uint , b as uint , c as uint , d as uint ]
31
37
}
32
- ipv6 ( a , b , c , d , e , f , g , h ) {
38
+ ipv6 ( _ , _ , _ , _ , _ , _ , _ , _ ) {
33
39
fail "FIXME impl parsing of ipv6 addr" ;
34
40
}
35
41
}
@@ -52,14 +58,32 @@ j Fails if the string is not a valid IPv4 address
52
58
* an `ip_addr` of the `ipv4` variant
53
59
" ]
54
60
fn parse_addr ( ip : str ) -> ip_addr {
61
+ alt try_parse_addr ( ip) {
62
+ result:: ok ( addr) { addr }
63
+ result:: err ( err_data) {
64
+ fail err_data. err_msg
65
+ }
66
+ }
67
+ }
68
+ fn try_parse_addr ( ip : str ) -> result:: result < ip_addr , parse_addr_err > {
55
69
let parts = vec:: map ( str:: split_char ( ip, '.' ) , { |s|
56
70
alt uint:: from_str ( s) {
57
71
some ( n) if n <= 255 u { n }
58
- _ { fail "Invalid IP Address part." }
72
+ _ { 256 u }
59
73
}
60
74
} ) ;
61
- if vec:: len ( parts) != 4 u { fail "Too many dots in IP address" ; }
62
- ipv4 ( parts[ 0 ] as u8 , parts[ 1 ] as u8 , parts[ 2 ] as u8 , parts[ 3 ] as u8 )
75
+ if vec:: len ( parts) != 4 u {
76
+ result:: err ( { err_msg : #fmt( "'%s' doesn't have 4 parts" ,
77
+ ip) } )
78
+ }
79
+ else if vec:: contains ( parts, 256 u) {
80
+ result:: err ( { err_msg : #fmt( "invalid octal in provided addr '%s'" ,
81
+ ip) } )
82
+ }
83
+ else {
84
+ result:: ok ( ipv4 ( parts[ 0 ] as u8 , parts[ 1 ] as u8 ,
85
+ parts[ 2 ] as u8 , parts[ 3 ] as u8 ) )
86
+ }
63
87
}
64
88
}
65
89
0 commit comments