5
5
use std:: fmt;
6
6
use std:: f32:: consts:: PI ;
7
7
8
- use super :: { Token , Parser , ToCss , ParseError , BasicParseError } ;
8
+ use super :: { Token , Parser , ToCss } ;
9
9
use tokenizer:: NumericValue ;
10
10
11
11
#[ cfg( feature = "serde" ) ]
@@ -141,48 +141,46 @@ impl Color {
141
141
/// Parse a <color> value, per CSS Color Module Level 3.
142
142
///
143
143
/// FIXME(#2) Deprecated CSS2 System Colors are not supported yet.
144
- pub fn parse < ' i , ' t > ( input : & mut Parser < ' i , ' t > ) -> Result < Color , BasicParseError < ' i > > {
145
- let token = try!( input. next ( ) ) ;
146
- match token {
147
- Token :: Hash ( ref value) | Token :: IDHash ( ref value) => {
144
+ pub fn parse ( input : & mut Parser ) -> Result < Color , ( ) > {
145
+ match try!( input. next ( ) ) {
146
+ Token :: Hash ( value) | Token :: IDHash ( value) => {
148
147
Color :: parse_hash ( value. as_bytes ( ) )
149
148
} ,
150
- Token :: Ident ( ref value) => parse_color_keyword ( & * value) ,
151
- Token :: Function ( ref name) => {
152
- return input. parse_nested_block ( |arguments| {
149
+ Token :: Ident ( value) => parse_color_keyword ( & * value) ,
150
+ Token :: Function ( name) => {
151
+ input. parse_nested_block ( |arguments| {
153
152
parse_color_function ( & * name, arguments)
154
- . map_err ( |e| ParseError :: Basic ( e) )
155
- } ) . map_err ( ParseError :: < ( ) > :: basic) ;
153
+ } )
156
154
}
157
155
_ => Err ( ( ) )
158
- } . map_err ( | ( ) | BasicParseError :: UnexpectedToken ( token ) )
156
+ }
159
157
}
160
158
161
159
/// Parse a color hash, without the leading '#' character.
162
160
#[ inline]
163
161
pub fn parse_hash ( value : & [ u8 ] ) -> Result < Self , ( ) > {
164
162
match value. len ( ) {
165
- 8 => Ok ( rgba (
163
+ 8 => rgba (
166
164
try!( from_hex ( value[ 0 ] ) ) * 16 + try!( from_hex ( value[ 1 ] ) ) ,
167
165
try!( from_hex ( value[ 2 ] ) ) * 16 + try!( from_hex ( value[ 3 ] ) ) ,
168
166
try!( from_hex ( value[ 4 ] ) ) * 16 + try!( from_hex ( value[ 5 ] ) ) ,
169
- try!( from_hex ( value[ 6 ] ) ) * 16 + try!( from_hex ( value[ 7 ] ) ) ) ,
167
+ try!( from_hex ( value[ 6 ] ) ) * 16 + try!( from_hex ( value[ 7 ] ) ) ,
170
168
) ,
171
- 6 => Ok ( rgb (
169
+ 6 => rgb (
172
170
try!( from_hex ( value[ 0 ] ) ) * 16 + try!( from_hex ( value[ 1 ] ) ) ,
173
171
try!( from_hex ( value[ 2 ] ) ) * 16 + try!( from_hex ( value[ 3 ] ) ) ,
174
- try!( from_hex ( value[ 4 ] ) ) * 16 + try!( from_hex ( value[ 5 ] ) ) ) ,
172
+ try!( from_hex ( value[ 4 ] ) ) * 16 + try!( from_hex ( value[ 5 ] ) ) ,
175
173
) ,
176
- 4 => Ok ( rgba (
174
+ 4 => rgba (
177
175
try!( from_hex ( value[ 0 ] ) ) * 17 ,
178
176
try!( from_hex ( value[ 1 ] ) ) * 17 ,
179
177
try!( from_hex ( value[ 2 ] ) ) * 17 ,
180
- try!( from_hex ( value[ 3 ] ) ) * 17 ) ,
178
+ try!( from_hex ( value[ 3 ] ) ) * 17 ,
181
179
) ,
182
- 3 => Ok ( rgb (
180
+ 3 => rgb (
183
181
try!( from_hex ( value[ 0 ] ) ) * 17 ,
184
182
try!( from_hex ( value[ 1 ] ) ) * 17 ,
185
- try!( from_hex ( value[ 2 ] ) ) * 17 ) ,
183
+ try!( from_hex ( value[ 2 ] ) ) * 17 ,
186
184
) ,
187
185
_ => Err ( ( ) )
188
186
}
@@ -192,13 +190,13 @@ impl Color {
192
190
193
191
194
192
#[ inline]
195
- fn rgb ( red : u8 , green : u8 , blue : u8 ) -> Color {
193
+ fn rgb ( red : u8 , green : u8 , blue : u8 ) -> Result < Color , ( ) > {
196
194
rgba ( red, green, blue, 255 )
197
195
}
198
196
199
197
#[ inline]
200
- fn rgba ( red : u8 , green : u8 , blue : u8 , alpha : u8 ) -> Color {
201
- Color :: RGBA ( RGBA :: new ( red, green, blue, alpha) )
198
+ fn rgba ( red : u8 , green : u8 , blue : u8 , alpha : u8 ) -> Result < Color , ( ) > {
199
+ Ok ( Color :: RGBA ( RGBA :: new ( red, green, blue, alpha) ) )
202
200
}
203
201
204
202
@@ -412,11 +410,11 @@ fn clamp_floor_256_f32(val: f32) -> u8 {
412
410
}
413
411
414
412
#[ inline]
415
- fn parse_color_function < ' i , ' t > ( name : & str , arguments : & mut Parser < ' i , ' t > ) -> Result < Color , BasicParseError < ' i > > {
413
+ fn parse_color_function ( name : & str , arguments : & mut Parser ) -> Result < Color , ( ) > {
416
414
let ( red, green, blue, uses_commas) = match_ignore_ascii_case ! { name,
417
415
"rgb" | "rgba" => parse_rgb_components_rgb( arguments) ?,
418
416
"hsl" | "hsla" => parse_rgb_components_hsl( arguments) ?,
419
- _ => return Err ( BasicParseError :: UnexpectedToken ( Token :: Ident ( name . to_owned ( ) . into ( ) ) ) ) ,
417
+ _ => return Err ( ( ) )
420
418
} ;
421
419
422
420
let alpha = if !arguments. is_exhausted ( ) {
@@ -425,7 +423,7 @@ fn parse_color_function<'i, 't>(name: &str, arguments: &mut Parser<'i, 't>) -> R
425
423
} else {
426
424
match try!( arguments. next ( ) ) {
427
425
Token :: Delim ( '/' ) => { } ,
428
- t => return Err ( BasicParseError :: UnexpectedToken ( t ) ) ,
426
+ _ => return Err ( ( ) )
429
427
} ;
430
428
} ;
431
429
let token = try!( arguments. next ( ) ) ;
@@ -436,21 +434,21 @@ fn parse_color_function<'i, 't>(name: &str, arguments: &mut Parser<'i, 't>) -> R
436
434
Token :: Percentage ( ref v) => {
437
435
clamp_unit_f32 ( v. unit_value )
438
436
}
439
- t => {
440
- return Err ( BasicParseError :: UnexpectedToken ( t ) )
437
+ _ => {
438
+ return Err ( ( ) )
441
439
}
442
440
}
443
441
} else {
444
442
255
445
443
} ;
446
444
447
445
try!( arguments. expect_exhausted ( ) ) ;
448
- Ok ( rgba ( red, green, blue, alpha) )
446
+ rgba ( red, green, blue, alpha)
449
447
}
450
448
451
449
452
450
#[ inline]
453
- fn parse_rgb_components_rgb < ' i , ' t > ( arguments : & mut Parser < ' i , ' t > ) -> Result < ( u8 , u8 , u8 , bool ) , BasicParseError < ' i > > {
451
+ fn parse_rgb_components_rgb ( arguments : & mut Parser ) -> Result < ( u8 , u8 , u8 , bool ) , ( ) > {
454
452
let red: u8 ;
455
453
let green: u8 ;
456
454
let blue: u8 ;
@@ -467,7 +465,7 @@ fn parse_rgb_components_rgb<'i, 't>(arguments: &mut Parser<'i, 't>) -> Result<(u
467
465
uses_commas = true ;
468
466
try!( arguments. expect_number ( ) )
469
467
}
470
- t => return Err ( BasicParseError :: UnexpectedToken ( t ) )
468
+ _ => return Err ( ( ) )
471
469
} ) ;
472
470
if uses_commas {
473
471
try!( arguments. expect_comma ( ) ) ;
@@ -482,38 +480,36 @@ fn parse_rgb_components_rgb<'i, 't>(arguments: &mut Parser<'i, 't>) -> Result<(u
482
480
uses_commas = true ;
483
481
try!( arguments. expect_percentage ( ) )
484
482
}
485
- t => return Err ( BasicParseError :: UnexpectedToken ( t ) )
483
+ _ => return Err ( ( ) )
486
484
} ) ;
487
485
if uses_commas {
488
486
try!( arguments. expect_comma ( ) ) ;
489
487
}
490
488
blue = clamp_unit_f32 ( try!( arguments. expect_percentage ( ) ) ) ;
491
489
}
492
- t => return Err ( BasicParseError :: UnexpectedToken ( t ) )
490
+ _ => return Err ( ( ) )
493
491
} ;
494
492
return Ok ( ( red, green, blue, uses_commas) ) ;
495
493
}
496
494
497
495
#[ inline]
498
- fn parse_rgb_components_hsl < ' i , ' t > ( arguments : & mut Parser < ' i , ' t > ) -> Result < ( u8 , u8 , u8 , bool ) , BasicParseError < ' i > > {
496
+ fn parse_rgb_components_hsl ( arguments : & mut Parser ) -> Result < ( u8 , u8 , u8 , bool ) , ( ) > {
499
497
let mut uses_commas = false ;
500
498
// Hue given as an angle
501
499
// https://drafts.csswg.org/css-values/#angles
502
- let token = try!( arguments. next ( ) ) ;
503
- let hue_degrees = match token {
504
- Token :: Number ( NumericValue { value : v, .. } ) => Ok ( v) ,
505
- Token :: Dimension ( NumericValue { value : v, .. } , ref unit) => {
500
+ let hue_degrees = match try!( arguments. next ( ) ) {
501
+ Token :: Number ( NumericValue { value : v, .. } ) => v,
502
+ Token :: Dimension ( NumericValue { value : v, .. } , unit) => {
506
503
match_ignore_ascii_case ! { & * unit,
507
- "deg" => Ok ( v ) ,
508
- "grad" => Ok ( v * 360. / 400. ) ,
509
- "rad" => Ok ( v * 360. / ( 2. * PI ) ) ,
510
- "turn" => Ok ( v * 360. ) ,
511
- _ => Err ( ( ) ) ,
504
+ "deg" => v ,
505
+ "grad" => v * 360. / 400. ,
506
+ "rad" => v * 360. / ( 2. * PI ) ,
507
+ "turn" => v * 360. ,
508
+ _ => return Err ( ( ) )
512
509
}
513
510
}
514
- t => return Err ( BasicParseError :: UnexpectedToken ( t ) )
511
+ _ => return Err ( ( ) )
515
512
} ;
516
- let hue_degrees = try!( hue_degrees. map_err ( |( ) | BasicParseError :: UnexpectedToken ( token) ) ) ;
517
513
// Subtract an integer before rounding, to avoid some rounding errors:
518
514
let hue_normalized_degrees = hue_degrees - 360. * ( hue_degrees / 360. ) . floor ( ) ;
519
515
let hue = hue_normalized_degrees / 360. ;
@@ -526,7 +522,7 @@ fn parse_rgb_components_hsl<'i, 't>(arguments: &mut Parser<'i, 't>) -> Result<(u
526
522
uses_commas = true ;
527
523
try!( arguments. expect_percentage ( ) )
528
524
}
529
- t => return Err ( BasicParseError :: UnexpectedToken ( t ) )
525
+ _ => return Err ( ( ) )
530
526
} ;
531
527
let saturation = saturation. max ( 0. ) . min ( 1. ) ;
532
528
0 commit comments