@@ -141,10 +141,6 @@ impl cmp::Ord for Version {
141
141
}
142
142
}
143
143
144
- condition ! {
145
- bad_parse: ( ) -> ( ) ;
146
- }
147
-
148
144
fn take_nonempty_prefix < T : Iterator < char > > ( rdr : & mut T , pred: |char| -> bool)
149
145
-> ( ~str , Option < char > ) {
150
146
let mut buf = ~"";
@@ -159,53 +155,66 @@ fn take_nonempty_prefix<T:Iterator<char>>(rdr: &mut T, pred: |char| -> bool)
159
155
}
160
156
}
161
157
}
162
- if buf. is_empty ( ) {
163
- bad_parse:: cond. raise ( ( ) )
164
- }
165
158
debug ! ( "extracted nonempty prefix: {}" , buf) ;
166
159
( buf, ch)
167
160
}
168
161
169
- fn take_num < T : Iterator < char > > ( rdr : & mut T ) -> ( uint , Option < char > ) {
162
+ fn take_num < T : Iterator < char > > ( rdr : & mut T ) -> Option < ( uint , Option < char > ) > {
170
163
let ( s, ch) = take_nonempty_prefix ( rdr, char:: is_digit) ;
171
164
match from_str :: < uint > ( s) {
172
- None => { bad_parse :: cond . raise ( ( ) ) ; ( 0 , ch ) } ,
173
- Some ( i) => ( i, ch)
165
+ None => None ,
166
+ Some ( i) => Some ( ( i, ch) )
174
167
}
175
168
}
176
169
177
- fn take_ident < T : Iterator < char > > ( rdr : & mut T ) -> ( Identifier , Option < char > ) {
170
+ fn take_ident < T : Iterator < char > > ( rdr : & mut T ) -> Option < ( Identifier , Option < char > ) > {
178
171
let ( s, ch) = take_nonempty_prefix ( rdr, char:: is_alphanumeric) ;
179
172
if s. chars ( ) . all ( char:: is_digit) {
180
173
match from_str :: < uint > ( s) {
181
- None => { bad_parse :: cond . raise ( ( ) ) ; ( Numeric ( 0 ) , ch ) } ,
182
- Some ( i) => ( Numeric ( i) , ch)
174
+ None => None ,
175
+ Some ( i) => Some ( ( Numeric ( i) , ch) )
183
176
}
184
177
} else {
185
- ( AlphaNumeric ( s) , ch)
178
+ Some ( ( AlphaNumeric ( s) , ch) )
186
179
}
187
180
}
188
181
189
- fn expect ( ch : Option < char > , c : char ) {
182
+ fn expect ( ch : Option < char > , c : char ) -> Option < ( ) > {
190
183
if ch != Some ( c) {
191
- bad_parse:: cond. raise ( ( ) )
184
+ None
185
+ } else {
186
+ Some ( ( ) )
192
187
}
193
188
}
194
189
195
- fn parse_iter < T : Iterator < char > > ( rdr : & mut T ) -> Version {
196
- let ( major, ch) = take_num ( rdr) ;
197
- expect ( ch, '.' ) ;
198
- let ( minor, ch) = take_num ( rdr) ;
199
- expect ( ch, '.' ) ;
200
- let ( patch, ch) = take_num ( rdr) ;
190
+ fn parse_iter < T : Iterator < char > > ( rdr : & mut T ) -> Option < Version > {
191
+ let maybe_vers = take_num ( rdr) . and_then ( |( major, ch) | {
192
+ expect ( ch, '.' ) . and_then ( |_| Some ( major) )
193
+ } ) . and_then ( |major| {
194
+ take_num ( rdr) . and_then ( |( minor, ch) | {
195
+ expect ( ch, '.' ) . and_then ( |_| Some ( ( major, minor) ) )
196
+ } )
197
+ } ) . and_then ( |( major, minor) | {
198
+ take_num ( rdr) . and_then ( |( patch, ch) | {
199
+ Some ( ( major, minor, patch, ch) )
200
+ } )
201
+ } ) ;
202
+
203
+ let ( major, minor, patch, ch) = match maybe_vers {
204
+ Some ( ( a, b, c, d) ) => ( a, b, c, d) ,
205
+ None => return None
206
+ } ;
201
207
202
208
let mut pre = ~[ ] ;
203
209
let mut build = ~[ ] ;
204
210
205
211
let mut ch = ch;
206
212
if ch == Some ( '-' ) {
207
213
loop {
208
- let ( id, c) = take_ident ( rdr) ;
214
+ let ( id, c) = match take_ident ( rdr) {
215
+ Some ( ( id, c) ) => ( id, c) ,
216
+ None => return None
217
+ } ;
209
218
pre. push ( id) ;
210
219
ch = c;
211
220
if ch != Some ( '.' ) { break ; }
@@ -214,20 +223,23 @@ fn parse_iter<T: Iterator<char>>(rdr: &mut T) -> Version {
214
223
215
224
if ch == Some ( '+' ) {
216
225
loop {
217
- let ( id, c) = take_ident ( rdr) ;
226
+ let ( id, c) = match take_ident ( rdr) {
227
+ Some ( ( id, c) ) => ( id, c) ,
228
+ None => return None
229
+ } ;
218
230
build. push ( id) ;
219
231
ch = c;
220
232
if ch != Some ( '.' ) { break ; }
221
233
}
222
234
}
223
235
224
- Version {
236
+ Some ( Version {
225
237
major : major,
226
238
minor : minor,
227
239
patch : patch,
228
240
pre : pre,
229
241
build : build,
230
- }
242
+ } )
231
243
}
232
244
233
245
@@ -237,15 +249,17 @@ pub fn parse(s: &str) -> Option<Version> {
237
249
return None ;
238
250
}
239
251
let s = s. trim ( ) ;
240
- let mut bad = false ;
241
- bad_parse:: cond. trap ( |_| { debug ! ( "bad" ) ; bad = true } ) . inside ( || {
242
- let v = parse_iter ( & mut s. chars ( ) ) ;
243
- if bad || v. to_str ( ) != s. to_owned ( ) {
244
- None
245
- } else {
246
- Some ( v)
252
+ let v = parse_iter ( & mut s. chars ( ) ) ;
253
+ match v {
254
+ Some ( v) => {
255
+ if v. to_str ( ) . equiv ( & s) {
256
+ Some ( v)
257
+ } else {
258
+ None
259
+ }
247
260
}
248
- } )
261
+ None => None
262
+ }
249
263
}
250
264
251
265
#[ test]
0 commit comments