@@ -11,27 +11,20 @@ fn main() {
11
11
let file1 = & args[ 1 ] ;
12
12
let file2 = & args[ 2 ] ;
13
13
14
- let data =
14
+ let data1 =
15
15
& fs:: read_to_string ( file1) . expect ( & format ! ( "Error occurred while reading {}" , file1) ) ;
16
16
let data2 =
17
17
& fs:: read_to_string ( file2) . expect ( & format ! ( "Error occurred while reading {}" , file2) ) ;
18
18
19
- display_output ( compare_jsons ( data, data2) ) ;
20
- }
21
-
22
- fn compare_jsons ( a : & str , b : & str ) -> Mismatch {
23
- let value: Value = serde_json:: from_str ( a) . unwrap ( ) ;
24
- let value2: Value = serde_json:: from_str ( b) . unwrap ( ) ;
25
-
26
- match_json ( & value, & value2)
19
+ display_output ( compare_jsons ( data1, data2) ) ;
27
20
}
28
21
29
22
fn display_output ( result : Mismatch ) {
30
23
match result {
31
- Mismatch :: NoMismatch => println ! ( "No mismatch was found." ) ,
32
- Mismatch :: ValueMismatch => println ! ( "Mismatch at root." ) ,
33
- Mismatch :: ObjectMismatch ( None , None , None ) => println ! ( "No mismatch was found." ) ,
34
- Mismatch :: ObjectMismatch ( a, b, c) => {
24
+ Mismatch :: None => println ! ( "No mismatch was found." ) ,
25
+ Mismatch :: Values => println ! ( "Mismatch at root." ) ,
26
+ Mismatch :: Objects ( None , None , None ) => println ! ( "No mismatch was found." ) ,
27
+ Mismatch :: Objects ( a, b, c) => {
35
28
if let Some ( left_keys) = a {
36
29
println ! (
37
30
"Following keys were not found in second object: {:?}" ,
@@ -59,86 +52,81 @@ struct KeyMap {
59
52
keys : HashMap < String , Option < KeyMap > > ,
60
53
}
61
54
62
- #[ derive( Debug ) ]
55
+ #[ derive( Debug , PartialEq ) ]
63
56
enum Mismatch {
64
- NoMismatch ,
65
- ValueMismatch ,
66
- ObjectMismatch ( Option < KeyMap > , Option < KeyMap > , Option < KeyMap > ) ,
57
+ None ,
58
+ Values ,
59
+ Objects ( Option < KeyMap > , Option < KeyMap > , Option < KeyMap > ) ,
67
60
}
68
61
69
- fn match_json ( value : & Value , value1 : & Value ) -> Mismatch {
70
- match ( value, value1) {
71
- ( Value :: Object ( a) , Value :: Object ( b) ) => {
72
- let ( left, right, intersection) = intersect_maps ( & a, & b) ;
73
- let mut unequal_keys = None ;
74
-
75
- let mut left = left. map ( |l| KeyMap {
76
- keys : l
77
- . iter ( )
78
- . map ( |x| ( String :: from ( x) , None ) )
79
- . collect :: < HashMap < String , Option < KeyMap > > > ( ) ,
80
- } ) ;
62
+ fn compare_jsons ( a : & str , b : & str ) -> Mismatch {
63
+ let value: Value = serde_json:: from_str ( a) . unwrap ( ) ;
64
+ let value2: Value = serde_json:: from_str ( b) . unwrap ( ) ;
81
65
82
- let mut right = right. map ( |r| KeyMap {
83
- keys : r
84
- . iter ( )
85
- . map ( |x| ( String :: from ( x) , None ) )
86
- . collect :: < HashMap < String , Option < KeyMap > > > ( ) ,
87
- } ) ;
66
+ match_json ( & value, & value2)
67
+ }
88
68
89
- if let Some ( intersection) = intersection {
90
- for key in intersection {
91
- if let Some ( ( key, value) ) =
92
- match match_json ( & a. get ( & key) . unwrap ( ) , & b. get ( & key) . unwrap ( ) ) {
93
- Mismatch :: NoMismatch => None ,
69
+ fn match_json ( value1 : & Value , value2 : & Value ) -> Mismatch {
70
+ match ( value1, value2) {
71
+ ( Value :: Object ( a) , Value :: Object ( b) ) => {
72
+ let ( left_only_keys, right_only_keys, intersection_keys) = intersect_maps ( & a, & b) ;
94
73
95
- Mismatch :: ValueMismatch => Some ( ( key, None ) ) ,
74
+ let mut unequal_keys = None ;
75
+ let mut left_only_keys = get_map_of_keys ( left_only_keys) ;
76
+ let mut right_only_keys = get_map_of_keys ( right_only_keys) ;
96
77
97
- Mismatch :: ObjectMismatch ( left_keys, right_keys, mismatch_keys) => {
98
- if let Some ( left_keys) = left_keys {
99
- left. get_or_insert ( KeyMap {
100
- keys : HashMap :: new ( ) ,
101
- } )
102
- . keys
103
- . insert ( String :: from ( & key) , Some ( left_keys) ) ;
104
- }
105
- if let Some ( right_keys) = right_keys {
106
- right
107
- . get_or_insert ( KeyMap {
108
- keys : HashMap :: new ( ) ,
109
- } )
110
- . keys
111
- . insert ( String :: from ( & key) , Some ( right_keys) ) ;
112
- }
113
- if let Some ( mismatch_keys) = mismatch_keys {
114
- Some ( ( String :: from ( & key) , Some ( mismatch_keys) ) )
115
- } else {
116
- None
117
- }
118
- }
119
- }
120
- {
121
- unequal_keys
122
- . get_or_insert ( KeyMap {
78
+ if let Some ( intersection_keys) = intersection_keys {
79
+ for key in intersection_keys {
80
+ match match_json ( & a. get ( & key) . unwrap ( ) , & b. get ( & key) . unwrap ( ) ) {
81
+ Mismatch :: Values => {
82
+ unequal_keys. get_or_insert ( KeyMap {
123
83
keys : HashMap :: new ( ) ,
124
84
} )
125
85
. keys
126
- . insert ( key, value) ;
86
+ . insert ( String :: from ( & key) , None ) ;
87
+ } ,
88
+
89
+ Mismatch :: Objects ( left_keys, right_keys, mismatch_keys) => {
90
+ insert_child_key_map ( & mut left_only_keys, left_keys, & key) ;
91
+ insert_child_key_map ( & mut right_only_keys, right_keys, & key) ;
92
+ insert_child_key_map ( & mut unequal_keys, mismatch_keys, & key) ;
93
+ } ,
94
+
95
+ Mismatch :: None => ( ) ,
127
96
}
128
97
}
129
98
}
130
- Mismatch :: ObjectMismatch ( left , right , unequal_keys)
99
+ Mismatch :: Objects ( left_only_keys , right_only_keys , unequal_keys)
131
100
}
132
101
( a, b) => {
133
102
if a == b {
134
- Mismatch :: NoMismatch
103
+ Mismatch :: None
135
104
} else {
136
- Mismatch :: ValueMismatch
105
+ Mismatch :: Values
137
106
}
138
107
}
139
108
}
140
109
}
141
110
111
+ fn get_map_of_keys ( set : Option < HashSet < String > > ) -> Option < KeyMap > {
112
+ set. map ( |s| KeyMap {
113
+ keys : s
114
+ . iter ( )
115
+ . map ( |key| ( String :: from ( key) , None ) )
116
+ . collect ( ) ,
117
+ } )
118
+ }
119
+
120
+ fn insert_child_key_map ( parent : & mut Option < KeyMap > , child : Option < KeyMap > , key : & String ) {
121
+ if child. is_some ( ) {
122
+ parent. get_or_insert ( KeyMap {
123
+ keys : HashMap :: new ( ) ,
124
+ } )
125
+ . keys
126
+ . insert ( String :: from ( key) , child) ; // TODO check: do we ever insert 'None' here?
127
+ }
128
+ }
129
+
142
130
fn intersect_maps (
143
131
a : & Map < String , Value > ,
144
132
b : & Map < String , Value > ,
@@ -210,7 +198,7 @@ mod tests {
210
198
211
199
let mismatch = compare_jsons ( data1, data2) ;
212
200
match mismatch {
213
- Mismatch :: ObjectMismatch ( Some ( a) , Some ( b) , Some ( c) ) => {
201
+ Mismatch :: Objects ( Some ( a) , Some ( b) , Some ( c) ) => {
214
202
let expected_left = KeyMap {
215
203
keys : hashmap ! {
216
204
"b" . to_string( ) => Some ( KeyMap {
@@ -272,7 +260,41 @@ mod tests {
272
260
assert_eq ! ( b, expected_right, "Right was incorrect." ) ;
273
261
assert_eq ! ( c, expected_uneq, "unequals were incorrect." ) ;
274
262
}
275
- _ => assert ! ( false , "Mismatch was not of type ObjectMismatch " ) ,
263
+ _ => assert ! ( false , "Mismatch was not of type Objects " ) ,
276
264
}
277
265
}
266
+
267
+ #[ test]
268
+ fn no_diff ( ) {
269
+ let data1 = r#"{
270
+ "a":"b",
271
+ "b":{
272
+ "c":{
273
+ "d":true,
274
+ "e":5,
275
+ "f":9,
276
+ "h":{
277
+ "i":true,
278
+ "j":false
279
+ }
280
+ }
281
+ }
282
+ }"# ;
283
+ let data2 = r#"{
284
+ "a":"b",
285
+ "b":{
286
+ "c":{
287
+ "d":true,
288
+ "e":5,
289
+ "f":9,
290
+ "h":{
291
+ "i":true,
292
+ "j":false
293
+ }
294
+ }
295
+ }
296
+ }"# ;
297
+
298
+ assert_eq ! ( compare_jsons( data1, data2) , Mismatch :: Objects ( None , None , None ) ) ;
299
+ }
278
300
}
0 commit comments