@@ -12,71 +12,80 @@ use super::{Token, Parser, BasicParseError};
12
12
/// in which case the caller needs to check if the arguments’ parser is exhausted.
13
13
/// Return `Ok((A, B))`, or `Err(())` for a syntax error.
14
14
pub fn parse_nth < ' i , ' t > ( input : & mut Parser < ' i , ' t > ) -> Result < ( i32 , i32 ) , BasicParseError < ' i > > {
15
- let token = input . next ( ) ? ;
16
- match token {
15
+ // FIXME: remove .clone() when lifetimes are non-lexical.
16
+ match input . next ( ) ? . clone ( ) {
17
17
Token :: Number { int_value : Some ( b) , .. } => {
18
18
Ok ( ( 0 , b) )
19
19
}
20
- Token :: Dimension { int_value : Some ( a) , ref unit, .. } => {
20
+ Token :: Dimension { int_value : Some ( a) , unit, .. } => {
21
21
match_ignore_ascii_case ! {
22
22
& unit,
23
23
"n" => Ok ( try!( parse_b( input, a) ) ) ,
24
24
"n-" => Ok ( try!( parse_signless_b( input, a, -1 ) ) ) ,
25
- _ => {
26
- parse_n_dash_digits( & * unit) . map( |val| ( a, val) )
25
+ _ => match parse_n_dash_digits( & * unit) {
26
+ Ok ( b) => Ok ( ( a, b) ) ,
27
+ Err ( ( ) ) => Err ( BasicParseError :: UnexpectedToken ( Token :: Ident ( unit. clone( ) ) ) )
27
28
}
28
29
}
29
30
}
30
- Token :: Ident ( ref value) => {
31
+ Token :: Ident ( value) => {
31
32
match_ignore_ascii_case ! { & value,
32
33
"even" => Ok ( ( 2 , 0 ) ) ,
33
34
"odd" => Ok ( ( 2 , 1 ) ) ,
34
35
"n" => Ok ( try!( parse_b( input, 1 ) ) ) ,
35
36
"-n" => Ok ( try!( parse_b( input, -1 ) ) ) ,
36
37
"n-" => Ok ( try!( parse_signless_b( input, 1 , -1 ) ) ) ,
37
38
"-n-" => Ok ( try!( parse_signless_b( input, -1 , -1 ) ) ) ,
38
- _ => if value. starts_with( "-" ) {
39
- parse_n_dash_digits( & value[ 1 ..] ) . map( |v| ( -1 , v) )
40
- } else {
41
- parse_n_dash_digits( & * value) . map( |v| ( 1 , v) )
39
+ _ => {
40
+ let ( slice, a) = if value. starts_with( "-" ) {
41
+ ( & value[ 1 ..] , -1 )
42
+ } else {
43
+ ( & * value, 1 )
44
+ } ;
45
+ match parse_n_dash_digits( slice) {
46
+ Ok ( b) => Ok ( ( a, b) ) ,
47
+ Err ( ( ) ) => Err ( BasicParseError :: UnexpectedToken ( Token :: Ident ( value. clone( ) ) ) )
48
+ }
42
49
}
43
50
}
44
51
}
45
- Token :: Delim ( '+' ) => match input. next_including_whitespace ( ) ? {
52
+ // FIXME: remove .clone() when lifetimes are non-lexical.
53
+ Token :: Delim ( '+' ) => match input. next_including_whitespace ( ) ?. clone ( ) {
46
54
Token :: Ident ( value) => {
47
55
match_ignore_ascii_case ! { & value,
48
- "n" => Ok ( try!( parse_b( input, 1 ) ) ) ,
49
- "n-" => Ok ( try!( parse_signless_b( input, 1 , -1 ) ) ) ,
50
- _ => parse_n_dash_digits( & * value) . map( |v| ( 1 , v) )
56
+ "n" => parse_b( input, 1 ) ,
57
+ "n-" => parse_signless_b( input, 1 , -1 ) ,
58
+ _ => match parse_n_dash_digits( & * value) {
59
+ Ok ( b) => Ok ( ( 1 , b) ) ,
60
+ Err ( ( ) ) => Err ( BasicParseError :: UnexpectedToken ( Token :: Ident ( value. clone( ) ) ) )
61
+ }
51
62
}
52
63
}
53
- t => return Err ( BasicParseError :: UnexpectedToken ( t ) ) ,
64
+ token => Err ( BasicParseError :: UnexpectedToken ( token ) ) ,
54
65
} ,
55
- _ => Err ( ( ) ) ,
56
- } . map_err ( | ( ) | BasicParseError :: UnexpectedToken ( token ) )
66
+ token => Err ( BasicParseError :: UnexpectedToken ( token ) ) ,
67
+ }
57
68
}
58
69
59
70
60
71
fn parse_b < ' i , ' t > ( input : & mut Parser < ' i , ' t > , a : i32 ) -> Result < ( i32 , i32 ) , BasicParseError < ' i > > {
61
72
let start_position = input. position ( ) ;
62
- let token = input. next ( ) ;
63
- match token {
64
- Ok ( Token :: Delim ( '+' ) ) => Ok ( parse_signless_b ( input, a, 1 ) ?) ,
65
- Ok ( Token :: Delim ( '-' ) ) => Ok ( parse_signless_b ( input, a, -1 ) ?) ,
66
- Ok ( Token :: Number { has_sign : true , int_value : Some ( b) , .. } ) => Ok ( ( a, b) ) ,
73
+ match input. next ( ) {
74
+ Ok ( & Token :: Delim ( '+' ) ) => parse_signless_b ( input, a, 1 ) ,
75
+ Ok ( & Token :: Delim ( '-' ) ) => parse_signless_b ( input, a, -1 ) ,
76
+ Ok ( & Token :: Number { has_sign : true , int_value : Some ( b) , .. } ) => Ok ( ( a, b) ) ,
67
77
_ => {
68
78
input. reset ( start_position) ;
69
79
Ok ( ( a, 0 ) )
70
80
}
71
- } . map_err ( | ( ) | BasicParseError :: UnexpectedToken ( token . unwrap ( ) ) )
81
+ }
72
82
}
73
83
74
84
fn parse_signless_b < ' i , ' t > ( input : & mut Parser < ' i , ' t > , a : i32 , b_sign : i32 ) -> Result < ( i32 , i32 ) , BasicParseError < ' i > > {
75
- let token = input. next ( ) ?;
76
- match token {
85
+ match * input. next ( ) ? {
77
86
Token :: Number { has_sign : false , int_value : Some ( b) , .. } => Ok ( ( a, b_sign * b) ) ,
78
- _ => Err ( ( ) )
79
- } . map_err ( | ( ) | BasicParseError :: UnexpectedToken ( token ) )
87
+ ref token => Err ( BasicParseError :: UnexpectedToken ( token . clone ( ) ) )
88
+ }
80
89
}
81
90
82
91
fn parse_n_dash_digits ( string : & str ) -> Result < i32 , ( ) > {
0 commit comments