6
6
extern crate test;
7
7
8
8
use encoding_rs;
9
- use rustc_serialize :: json :: { self , Json , ToJson } ;
9
+ use serde_json :: { self , Value , json , Map } ;
10
10
11
11
#[ cfg( feature = "bench" ) ]
12
12
use self :: test:: Bencher ;
@@ -21,40 +21,39 @@ use super::{
21
21
22
22
macro_rules! JArray {
23
23
( $( $e: expr, ) * ) => { JArray ![ $( $e ) ,* ] } ;
24
- ( $( $e: expr) ,* ) => { Json :: Array ( vec!( $( $e. to_json( ) ) ,* ) ) }
24
+ ( $( $e: expr) ,* ) => { Value :: Array ( vec!( $( $e. to_json( ) ) ,* ) ) }
25
25
}
26
26
27
- fn almost_equals ( a : & Json , b : & Json ) -> bool {
27
+ fn almost_equals ( a : & Value , b : & Value ) -> bool {
28
28
match ( a, b) {
29
- ( & Json :: I64 ( a) , _) => almost_equals ( & Json :: F64 ( a as f64 ) , b) ,
30
- ( & Json :: U64 ( a) , _) => almost_equals ( & Json :: F64 ( a as f64 ) , b) ,
31
- ( _, & Json :: I64 ( b) ) => almost_equals ( a, & Json :: F64 ( b as f64 ) ) ,
32
- ( _, & Json :: U64 ( b) ) => almost_equals ( a, & Json :: F64 ( b as f64 ) ) ,
33
-
34
- ( & Json :: F64 ( a) , & Json :: F64 ( b) ) => ( a - b) . abs ( ) <= a. abs ( ) * 1e-6 ,
29
+ ( & Value :: Number ( ref a) , & Value :: Number ( ref b) ) => {
30
+ let a = a. as_f64 ( ) . unwrap ( ) ;
31
+ let b = b. as_f64 ( ) . unwrap ( ) ;
32
+ ( a - b) . abs ( ) <= a. abs ( ) * 1e-6
33
+ } ,
35
34
36
- ( & Json :: Boolean ( a) , & Json :: Boolean ( b) ) => a == b,
37
- ( & Json :: String ( ref a) , & Json :: String ( ref b) ) => a == b,
38
- ( & Json :: Array ( ref a) , & Json :: Array ( ref b) ) => {
35
+ ( & Value :: Bool ( a) , & Value :: Bool ( b) ) => a == b,
36
+ ( & Value :: String ( ref a) , & Value :: String ( ref b) ) => a == b,
37
+ ( & Value :: Array ( ref a) , & Value :: Array ( ref b) ) => {
39
38
a. len ( ) == b. len ( )
40
39
&& a. iter ( )
41
40
. zip ( b. iter ( ) )
42
41
. all ( |( ref a, ref b) | almost_equals ( * a, * b) )
43
42
}
44
- ( & Json :: Object ( _) , & Json :: Object ( _) ) => panic ! ( "Not implemented" ) ,
45
- ( & Json :: Null , & Json :: Null ) => true ,
43
+ ( & Value :: Object ( _) , & Value :: Object ( _) ) => panic ! ( "Not implemented" ) ,
44
+ ( & Value :: Null , & Value :: Null ) => true ,
46
45
_ => false ,
47
46
}
48
47
}
49
48
50
- fn normalize ( json : & mut Json ) {
49
+ fn normalize ( json : & mut Value ) {
51
50
match * json {
52
- Json :: Array ( ref mut list) => {
51
+ Value :: Array ( ref mut list) => {
53
52
for item in list. iter_mut ( ) {
54
53
normalize ( item)
55
54
}
56
55
}
57
- Json :: String ( ref mut s) => {
56
+ Value :: String ( ref mut s) => {
58
57
if * s == "extra-input" || * s == "empty" {
59
58
* s = "invalid" . to_string ( )
60
59
}
@@ -63,24 +62,24 @@ fn normalize(json: &mut Json) {
63
62
}
64
63
}
65
64
66
- fn assert_json_eq ( results : json :: Json , mut expected : json :: Json , message : & str ) {
65
+ fn assert_json_eq ( results : Value , mut expected : Value , message : & str ) {
67
66
normalize ( & mut expected) ;
68
67
if !almost_equals ( & results, & expected) {
69
68
println ! (
70
69
"{}" ,
71
70
:: difference:: Changeset :: new(
72
- & results . pretty ( ) . to_string ( ) ,
73
- & expected . pretty ( ) . to_string ( ) ,
71
+ & serde_json :: to_string_pretty ( & results ) . unwrap ( ) ,
72
+ & serde_json :: to_string_pretty ( & expected ) . unwrap ( ) ,
74
73
"\n " ,
75
74
)
76
75
) ;
77
76
panic ! ( "{}" , message)
78
77
}
79
78
}
80
79
81
- fn run_raw_json_tests < F : Fn ( Json , Json ) -> ( ) > ( json_data : & str , run : F ) {
82
- let items = match Json :: from_str ( json_data) {
83
- Ok ( Json :: Array ( items) ) => items,
80
+ fn run_raw_json_tests < F : Fn ( Value , Value ) -> ( ) > ( json_data : & str , run : F ) {
81
+ let items = match serde_json :: from_str ( json_data) {
82
+ Ok ( Value :: Array ( items) ) => items,
84
83
_ => panic ! ( "Invalid JSON" ) ,
85
84
} ;
86
85
assert ! ( items. len( ) % 2 == 0 ) ;
@@ -96,9 +95,9 @@ fn run_raw_json_tests<F: Fn(Json, Json) -> ()>(json_data: &str, run: F) {
96
95
}
97
96
}
98
97
99
- fn run_json_tests < F : Fn ( & mut Parser ) -> Json > ( json_data : & str , parse : F ) {
98
+ fn run_json_tests < F : Fn ( & mut Parser ) -> Value > ( json_data : & str , parse : F ) {
100
99
run_raw_json_tests ( json_data, |input, expected| match input {
101
- Json :: String ( input) => {
100
+ Value :: String ( input) => {
102
101
let mut parse_input = ParserInput :: new ( & input) ;
103
102
let result = parse ( & mut Parser :: new ( & mut parse_input) ) ;
104
103
assert_json_eq ( result, expected, & input) ;
@@ -111,7 +110,7 @@ fn run_json_tests<F: Fn(&mut Parser) -> Json>(json_data: &str, parse: F) {
111
110
fn component_value_list ( ) {
112
111
run_json_tests (
113
112
include_str ! ( "css-parsing-tests/component_value_list.json" ) ,
114
- |input| Json :: Array ( component_values_to_json ( input) ) ,
113
+ |input| Value :: Array ( component_values_to_json ( input) ) ,
115
114
) ;
116
115
}
117
116
@@ -120,7 +119,7 @@ fn one_component_value() {
120
119
run_json_tests (
121
120
include_str ! ( "css-parsing-tests/one_component_value.json" ) ,
122
121
|input| {
123
- let result: Result < Json , ParseError < ( ) > > = input. parse_entirely ( |input| {
122
+ let result: Result < Value , ParseError < ( ) > > = input. parse_entirely ( |input| {
124
123
Ok ( one_component_value_to_json ( input. next ( ) ?. clone ( ) , input) )
125
124
} ) ;
126
125
result. unwrap_or ( JArray ! [ "error" , "invalid" ] )
@@ -133,7 +132,7 @@ fn declaration_list() {
133
132
run_json_tests (
134
133
include_str ! ( "css-parsing-tests/declaration_list.json" ) ,
135
134
|input| {
136
- Json :: Array (
135
+ Value :: Array (
137
136
DeclarationListParser :: new ( input, JsonParser )
138
137
. map ( |result| result. unwrap_or ( JArray ! [ "error" , "invalid" ] ) )
139
138
. collect ( ) ,
@@ -155,7 +154,7 @@ fn one_declaration() {
155
154
#[ test]
156
155
fn rule_list ( ) {
157
156
run_json_tests ( include_str ! ( "css-parsing-tests/rule_list.json" ) , |input| {
158
- Json :: Array (
157
+ Value :: Array (
159
158
RuleListParser :: new_for_nested_rule ( input, JsonParser )
160
159
. map ( |result| result. unwrap_or ( JArray ! [ "error" , "invalid" ] ) )
161
160
. collect ( ) ,
@@ -166,7 +165,7 @@ fn rule_list() {
166
165
#[ test]
167
166
fn stylesheet ( ) {
168
167
run_json_tests ( include_str ! ( "css-parsing-tests/stylesheet.json" ) , |input| {
169
- Json :: Array (
168
+ Value :: Array (
170
169
RuleListParser :: new_for_stylesheet ( input, JsonParser )
171
170
. map ( |result| result. unwrap_or ( JArray ! [ "error" , "invalid" ] ) )
172
171
. collect ( ) ,
@@ -205,7 +204,7 @@ fn stylesheet_from_bytes() {
205
204
include_str ! ( "css-parsing-tests/stylesheet_bytes.json" ) ,
206
205
|input, expected| {
207
206
let map = match input {
208
- Json :: Object ( map) => map,
207
+ Value :: Object ( map) => map,
209
208
_ => panic ! ( "Unexpected JSON" ) ,
210
209
} ;
211
210
@@ -237,14 +236,14 @@ fn stylesheet_from_bytes() {
237
236
. collect :: < Vec < _ > > ( ) ;
238
237
JArray ! [ rules, used_encoding. name( ) . to_lowercase( ) ]
239
238
} ;
240
- assert_json_eq ( result, expected, & Json :: Object ( map) . to_string ( ) ) ;
239
+ assert_json_eq ( result, expected, & Value :: Object ( map) . to_string ( ) ) ;
241
240
} ,
242
241
) ;
243
242
244
- fn get_string < ' a > ( map : & ' a json :: Object , key : & str ) -> Option < & ' a str > {
243
+ fn get_string < ' a > ( map : & ' a Map < String , Value > , key : & str ) -> Option < & ' a str > {
245
244
match map. get ( key) {
246
- Some ( & Json :: String ( ref s) ) => Some ( s) ,
247
- Some ( & Json :: Null ) => None ,
245
+ Some ( & Value :: String ( ref s) ) => Some ( s) ,
246
+ Some ( & Value :: Null ) => None ,
248
247
None => None ,
249
248
_ => panic ! ( "Unexpected JSON" ) ,
250
249
}
@@ -354,7 +353,7 @@ fn test_expect_url() {
354
353
assert ! ( parse( & mut input) . is_err( ) ) ;
355
354
}
356
355
357
- fn run_color_tests < F : Fn ( Result < Color , ( ) > ) -> Json > ( json_data : & str , to_json : F ) {
356
+ fn run_color_tests < F : Fn ( Result < Color , ( ) > ) -> Value > ( json_data : & str , to_json : F ) {
358
357
run_json_tests ( json_data, |input| {
359
358
let result: Result < _ , ParseError < ( ) > > =
360
359
input. parse_entirely ( |i| Color :: parse ( i) . map_err ( Into :: into) ) ;
@@ -365,14 +364,14 @@ fn run_color_tests<F: Fn(Result<Color, ()>) -> Json>(json_data: &str, to_json: F
365
364
#[ test]
366
365
fn color3 ( ) {
367
366
run_color_tests ( include_str ! ( "css-parsing-tests/color3.json" ) , |c| {
368
- c. ok ( ) . to_json ( )
367
+ c. ok ( ) . map ( |v| v . to_json ( ) ) . unwrap_or ( Value :: Null )
369
368
} )
370
369
}
371
370
372
371
#[ test]
373
372
fn color3_hsl ( ) {
374
373
run_color_tests ( include_str ! ( "css-parsing-tests/color3_hsl.json" ) , |c| {
375
- c. ok ( ) . to_json ( )
374
+ c. ok ( ) . map ( |v| v . to_json ( ) ) . unwrap_or ( Value :: Null )
376
375
} )
377
376
}
378
377
@@ -381,7 +380,7 @@ fn color3_hsl() {
381
380
fn color3_keywords ( ) {
382
381
run_color_tests (
383
382
include_str ! ( "css-parsing-tests/color3_keywords.json" ) ,
384
- |c| c. ok ( ) . to_json ( ) ,
383
+ |c| c. ok ( ) . map ( |v| v . to_json ( ) ) . unwrap_or ( Value :: Null ) ,
385
384
)
386
385
}
387
386
@@ -394,7 +393,8 @@ fn nth() {
394
393
result
395
394
} )
396
395
. ok ( )
397
- . to_json ( )
396
+ . map ( |( v0, v1) | json ! ( [ v0, v1] ) )
397
+ . unwrap_or ( Value :: Null )
398
398
} ) ;
399
399
}
400
400
@@ -410,7 +410,17 @@ fn unicode_range() {
410
410
Ok ( None )
411
411
}
412
412
} ) ;
413
- result. unwrap ( ) . to_json ( )
413
+ result. unwrap ( )
414
+ . iter ( )
415
+ . map ( |v|
416
+ if let Some ( ( v0, v1) ) = v{
417
+ json ! ( [ v0, v1] )
418
+ } else {
419
+ Value :: Null
420
+ }
421
+ )
422
+ . collect :: < Vec < _ > > ( )
423
+ . to_json ( )
414
424
} ) ;
415
425
}
416
426
@@ -475,7 +485,7 @@ fn serializer(preserve_comments: bool) {
475
485
) ;
476
486
let mut input = ParserInput :: new ( & serialized) ;
477
487
let parser = & mut Parser :: new ( & mut input) ;
478
- Json :: Array ( component_values_to_json ( parser) )
488
+ Value :: Array ( component_values_to_json ( parser) )
479
489
} ,
480
490
) ;
481
491
}
@@ -795,15 +805,32 @@ fn identifier_serialization() {
795
805
) ;
796
806
}
797
807
808
+ trait ToJson {
809
+ fn to_json ( & self ) -> Value ;
810
+ }
811
+
812
+ impl < T > ToJson for T where T : Clone , Value : From < T > {
813
+ fn to_json ( & self ) -> Value {
814
+ Value :: from ( self . clone ( ) )
815
+ }
816
+ }
817
+
798
818
impl ToJson for Color {
799
- fn to_json ( & self ) -> json :: Json {
819
+ fn to_json ( & self ) -> Value {
800
820
match * self {
801
- Color :: RGBA ( ref rgba) => [ rgba. red , rgba. green , rgba. blue , rgba. alpha ] . to_json ( ) ,
821
+ Color :: RGBA ( ref rgba) => json ! ( [ rgba. red, rgba. green, rgba. blue, rgba. alpha] ) ,
802
822
Color :: CurrentColor => "currentcolor" . to_json ( ) ,
803
823
}
804
824
}
805
825
}
806
826
827
+ impl < ' a > ToJson for CowRcStr < ' a > {
828
+ fn to_json ( & self ) -> Value {
829
+ let s: & str = & * self ;
830
+ s. to_json ( )
831
+ }
832
+ }
833
+
807
834
#[ cfg( feature = "bench" ) ]
808
835
const BACKGROUND_IMAGE : & ' static str = include_str ! ( "big-data-url.css" ) ;
809
836
@@ -851,14 +878,14 @@ fn no_stack_overflow_multiple_nested_blocks() {
851
878
}
852
879
853
880
impl < ' i > DeclarationParser < ' i > for JsonParser {
854
- type Declaration = Json ;
881
+ type Declaration = Value ;
855
882
type Error = ( ) ;
856
883
857
884
fn parse_value < ' t > (
858
885
& mut self ,
859
886
name : CowRcStr < ' i > ,
860
887
input : & mut Parser < ' i , ' t > ,
861
- ) -> Result < Json , ParseError < ' i , ( ) > > {
888
+ ) -> Result < Value , ParseError < ' i , ( ) > > {
862
889
let mut value = vec ! [ ] ;
863
890
let mut important = false ;
864
891
loop {
@@ -889,20 +916,20 @@ impl<'i> DeclarationParser<'i> for JsonParser {
889
916
}
890
917
891
918
impl < ' i > AtRuleParser < ' i > for JsonParser {
892
- type PreludeNoBlock = Vec < Json > ;
893
- type PreludeBlock = Vec < Json > ;
894
- type AtRule = Json ;
919
+ type PreludeNoBlock = Vec < Value > ;
920
+ type PreludeBlock = Vec < Value > ;
921
+ type AtRule = Value ;
895
922
type Error = ( ) ;
896
923
897
924
fn parse_prelude < ' t > (
898
925
& mut self ,
899
926
name : CowRcStr < ' i > ,
900
927
input : & mut Parser < ' i , ' t > ,
901
- ) -> Result < AtRuleType < Vec < Json > , Vec < Json > > , ParseError < ' i , ( ) > > {
928
+ ) -> Result < AtRuleType < Vec < Value > , Vec < Value > > , ParseError < ' i , ( ) > > {
902
929
let prelude = vec ! [
903
930
"at-rule" . to_json( ) ,
904
931
name. to_json( ) ,
905
- Json :: Array ( component_values_to_json( input) ) ,
932
+ Value :: Array ( component_values_to_json( input) ) ,
906
933
] ;
907
934
match_ignore_ascii_case ! { & * name,
908
935
"media" | "foo-with-block" => Ok ( AtRuleType :: WithBlock ( prelude) ) ,
@@ -913,40 +940,40 @@ impl<'i> AtRuleParser<'i> for JsonParser {
913
940
}
914
941
}
915
942
916
- fn rule_without_block ( & mut self , mut prelude : Vec < Json > , _location : SourceLocation ) -> Json {
917
- prelude. push ( Json :: Null ) ;
918
- Json :: Array ( prelude)
943
+ fn rule_without_block ( & mut self , mut prelude : Vec < Value > , _location : SourceLocation ) -> Value {
944
+ prelude. push ( Value :: Null ) ;
945
+ Value :: Array ( prelude)
919
946
}
920
947
921
948
fn parse_block < ' t > (
922
949
& mut self ,
923
- mut prelude : Vec < Json > ,
950
+ mut prelude : Vec < Value > ,
924
951
_location : SourceLocation ,
925
952
input : & mut Parser < ' i , ' t > ,
926
- ) -> Result < Json , ParseError < ' i , ( ) > > {
927
- prelude. push ( Json :: Array ( component_values_to_json ( input) ) ) ;
928
- Ok ( Json :: Array ( prelude) )
953
+ ) -> Result < Value , ParseError < ' i , ( ) > > {
954
+ prelude. push ( Value :: Array ( component_values_to_json ( input) ) ) ;
955
+ Ok ( Value :: Array ( prelude) )
929
956
}
930
957
}
931
958
932
959
impl < ' i > QualifiedRuleParser < ' i > for JsonParser {
933
- type Prelude = Vec < Json > ;
934
- type QualifiedRule = Json ;
960
+ type Prelude = Vec < Value > ;
961
+ type QualifiedRule = Value ;
935
962
type Error = ( ) ;
936
963
937
964
fn parse_prelude < ' t > (
938
965
& mut self ,
939
966
input : & mut Parser < ' i , ' t > ,
940
- ) -> Result < Vec < Json > , ParseError < ' i , ( ) > > {
967
+ ) -> Result < Vec < Value > , ParseError < ' i , ( ) > > {
941
968
Ok ( component_values_to_json ( input) )
942
969
}
943
970
944
971
fn parse_block < ' t > (
945
972
& mut self ,
946
- prelude : Vec < Json > ,
973
+ prelude : Vec < Value > ,
947
974
_location : SourceLocation ,
948
975
input : & mut Parser < ' i , ' t > ,
949
- ) -> Result < Json , ParseError < ' i , ( ) > > {
976
+ ) -> Result < Value , ParseError < ' i , ( ) > > {
950
977
Ok ( JArray ! [
951
978
"qualified rule" ,
952
979
prelude,
@@ -955,16 +982,16 @@ impl<'i> QualifiedRuleParser<'i> for JsonParser {
955
982
}
956
983
}
957
984
958
- fn component_values_to_json ( input : & mut Parser ) -> Vec < Json > {
985
+ fn component_values_to_json ( input : & mut Parser ) -> Vec < Value > {
959
986
let mut values = vec ! [ ] ;
960
987
while let Ok ( token) = input. next_including_whitespace ( ) . map ( |t| t. clone ( ) ) {
961
988
values. push ( one_component_value_to_json ( token, input) ) ;
962
989
}
963
990
values
964
991
}
965
992
966
- fn one_component_value_to_json ( token : Token , input : & mut Parser ) -> Json {
967
- fn numeric ( value : f32 , int_value : Option < i32 > , has_sign : bool ) -> Vec < json :: Json > {
993
+ fn one_component_value_to_json ( token : Token , input : & mut Parser ) -> Value {
994
+ fn numeric ( value : f32 , int_value : Option < i32 > , has_sign : bool ) -> Vec < Value > {
968
995
vec ! [
969
996
Token :: Number {
970
997
value: value,
@@ -985,7 +1012,7 @@ fn one_component_value_to_json(token: Token, input: &mut Parser) -> Json {
985
1012
]
986
1013
}
987
1014
988
- fn nested ( input : & mut Parser ) -> Vec < Json > {
1015
+ fn nested ( input : & mut Parser ) -> Vec < Value > {
989
1016
let result: Result < _ , ParseError < ( ) > > =
990
1017
input. parse_nested_block ( |input| Ok ( component_values_to_json ( input) ) ) ;
991
1018
result. unwrap ( )
@@ -1005,7 +1032,7 @@ fn one_component_value_to_json(token: Token, input: &mut Parser) -> Json {
1005
1032
value,
1006
1033
int_value,
1007
1034
has_sign,
1008
- } => Json :: Array ( {
1035
+ } => Value :: Array ( {
1009
1036
let mut v = vec ! [ "number" . to_json( ) ] ;
1010
1037
v. extend ( numeric ( value, int_value, has_sign) ) ;
1011
1038
v
@@ -1014,7 +1041,7 @@ fn one_component_value_to_json(token: Token, input: &mut Parser) -> Json {
1014
1041
unit_value,
1015
1042
int_value,
1016
1043
has_sign,
1017
- } => Json :: Array ( {
1044
+ } => Value :: Array ( {
1018
1045
let mut v = vec ! [ "percentage" . to_json( ) ] ;
1019
1046
v. extend ( numeric ( unit_value * 100. , int_value, has_sign) ) ;
1020
1047
v
@@ -1024,7 +1051,7 @@ fn one_component_value_to_json(token: Token, input: &mut Parser) -> Json {
1024
1051
int_value,
1025
1052
has_sign,
1026
1053
unit,
1027
- } => Json :: Array ( {
1054
+ } => Value :: Array ( {
1028
1055
let mut v = vec ! [ "dimension" . to_json( ) ] ;
1029
1056
v. extend ( numeric ( value, int_value, has_sign) ) ;
1030
1057
v. push ( unit. to_json ( ) ) ;
@@ -1044,22 +1071,22 @@ fn one_component_value_to_json(token: Token, input: &mut Parser) -> Json {
1044
1071
Token :: CDO => "<!--" . to_json ( ) ,
1045
1072
Token :: CDC => "-->" . to_json ( ) ,
1046
1073
1047
- Token :: Function ( name) => Json :: Array ( {
1074
+ Token :: Function ( name) => Value :: Array ( {
1048
1075
let mut v = vec ! [ "function" . to_json( ) , name. to_json( ) ] ;
1049
1076
v. extend ( nested ( input) ) ;
1050
1077
v
1051
1078
} ) ,
1052
- Token :: ParenthesisBlock => Json :: Array ( {
1079
+ Token :: ParenthesisBlock => Value :: Array ( {
1053
1080
let mut v = vec ! [ "()" . to_json( ) ] ;
1054
1081
v. extend ( nested ( input) ) ;
1055
1082
v
1056
1083
} ) ,
1057
- Token :: SquareBracketBlock => Json :: Array ( {
1084
+ Token :: SquareBracketBlock => Value :: Array ( {
1058
1085
let mut v = vec ! [ "[]" . to_json( ) ] ;
1059
1086
v. extend ( nested ( input) ) ;
1060
1087
v
1061
1088
} ) ,
1062
- Token :: CurlyBracketBlock => Json :: Array ( {
1089
+ Token :: CurlyBracketBlock => Value :: Array ( {
1063
1090
let mut v = vec ! [ "{}" . to_json( ) ] ;
1064
1091
v. extend ( nested ( input) ) ;
1065
1092
v
0 commit comments