1
1
use serde_json;
2
2
use serde_json:: Map ;
3
3
use serde_json:: Value ;
4
- use std:: collections:: BTreeSet ;
4
+ use std:: collections:: HashMap ;
5
+ use std:: collections:: HashSet ;
5
6
use std:: env;
6
7
use std:: fs;
7
8
@@ -53,21 +54,16 @@ fn display_output(result: Mismatch) {
53
54
} ;
54
55
}
55
56
56
- #[ derive( Eq , PartialEq , Ord , PartialOrd , Debug ) ]
57
+ #[ derive( Debug , PartialEq ) ]
57
58
struct KeyMap {
58
- key : String ,
59
- children : Option < BTreeSet < KeyMap > > ,
59
+ keys : HashMap < String , Option < KeyMap > > ,
60
60
}
61
61
62
- #[ derive( Debug , PartialEq ) ]
62
+ #[ derive( Debug ) ]
63
63
enum Mismatch {
64
64
NoMismatch ,
65
65
ValueMismatch ,
66
- ObjectMismatch (
67
- Option < BTreeSet < KeyMap > > ,
68
- Option < BTreeSet < KeyMap > > ,
69
- Option < BTreeSet < KeyMap > > ,
70
- ) ,
66
+ ObjectMismatch ( Option < KeyMap > , Option < KeyMap > , Option < KeyMap > ) ,
71
67
}
72
68
73
69
fn match_json ( value : & Value , value1 : & Value ) -> Mismatch {
@@ -76,57 +72,58 @@ fn match_json(value: &Value, value1: &Value) -> Mismatch {
76
72
let ( left, right, intersection) = intersect_maps ( & a, & b) ;
77
73
let mut unequal_keys = None ;
78
74
79
- let mut left = left. map ( |l| {
80
- l. iter ( )
81
- . map ( |x| KeyMap {
82
- key : String :: from ( x) ,
83
- children : None ,
84
- } )
85
- . collect :: < BTreeSet < KeyMap > > ( )
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 > > > ( ) ,
86
80
} ) ;
87
- let mut right = right. map ( |r| {
88
- r. iter ( )
89
- . map ( |x| KeyMap {
90
- key : String :: from ( x) ,
91
- children : None ,
92
- } )
93
- . collect :: < BTreeSet < KeyMap > > ( )
81
+
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 > > > ( ) ,
94
87
} ) ;
95
88
96
89
if let Some ( intersection) = intersection {
97
90
for key in intersection {
98
- if let Some ( keys ) =
91
+ if let Some ( ( key , value ) ) =
99
92
match match_json ( & a. get ( & key) . unwrap ( ) , & b. get ( & key) . unwrap ( ) ) {
100
93
Mismatch :: NoMismatch => None ,
101
- Mismatch :: ValueMismatch => Some ( KeyMap {
102
- key,
103
- children : None ,
104
- } ) ,
94
+
95
+ Mismatch :: ValueMismatch => Some ( ( key, None ) ) ,
96
+
105
97
Mismatch :: ObjectMismatch ( left_keys, right_keys, mismatch_keys) => {
106
98
if let Some ( left_keys) = left_keys {
107
- left. get_or_insert ( BTreeSet :: new ( ) ) . insert ( KeyMap {
108
- key : String :: from ( & key) ,
109
- children : Some ( left_keys) ,
110
- } ) ;
99
+ left. get_or_insert ( KeyMap {
100
+ keys : HashMap :: new ( ) ,
101
+ } )
102
+ . keys
103
+ . insert ( String :: from ( & key) , Some ( left_keys) ) ;
111
104
}
112
105
if let Some ( right_keys) = right_keys {
113
- right. get_or_insert ( BTreeSet :: new ( ) ) . insert ( KeyMap {
114
- key : String :: from ( & key) ,
115
- children : Some ( right_keys) ,
116
- } ) ;
106
+ right
107
+ . get_or_insert ( KeyMap {
108
+ keys : HashMap :: new ( ) ,
109
+ } )
110
+ . keys
111
+ . insert ( String :: from ( & key) , Some ( right_keys) ) ;
117
112
}
118
113
if let Some ( mismatch_keys) = mismatch_keys {
119
- Some ( KeyMap {
120
- key : String :: from ( & key) ,
121
- children : Some ( mismatch_keys) ,
122
- } )
114
+ Some ( ( String :: from ( & key) , Some ( mismatch_keys) ) )
123
115
} else {
124
116
None
125
117
}
126
118
}
127
119
}
128
120
{
129
- unequal_keys. get_or_insert ( BTreeSet :: new ( ) ) . insert ( keys) ;
121
+ unequal_keys
122
+ . get_or_insert ( KeyMap {
123
+ keys : HashMap :: new ( ) ,
124
+ } )
125
+ . keys
126
+ . insert ( key, value) ;
130
127
}
131
128
}
132
129
}
@@ -146,13 +143,13 @@ fn intersect_maps(
146
143
a : & Map < String , Value > ,
147
144
b : & Map < String , Value > ,
148
145
) -> (
149
- Option < BTreeSet < String > > ,
150
- Option < BTreeSet < String > > ,
151
- Option < BTreeSet < String > > ,
146
+ Option < HashSet < String > > ,
147
+ Option < HashSet < String > > ,
148
+ Option < HashSet < String > > ,
152
149
) {
153
- let mut intersection = BTreeSet :: new ( ) ;
154
- let mut left = BTreeSet :: new ( ) ;
155
- let mut right = BTreeSet :: new ( ) ;
150
+ let mut intersection = HashSet :: new ( ) ;
151
+ let mut left = HashSet :: new ( ) ;
152
+ let mut right = HashSet :: new ( ) ;
156
153
for a_key in a. keys ( ) {
157
154
if b. contains_key ( a_key) {
158
155
intersection. insert ( String :: from ( a_key) ) ;
@@ -178,7 +175,7 @@ fn intersect_maps(
178
175
#[ cfg( test) ]
179
176
mod tests {
180
177
use super :: * ;
181
- use sugar :: btreeset ;
178
+ use maplit :: hashmap ;
182
179
183
180
#[ test]
184
181
fn nested_diff ( ) {
@@ -210,84 +207,65 @@ mod tests {
210
207
}
211
208
}
212
209
}"# ;
213
-
210
+
214
211
let mismatch = compare_jsons ( data1, data2) ;
215
212
match mismatch {
216
213
Mismatch :: ObjectMismatch ( Some ( a) , Some ( b) , Some ( c) ) => {
217
- let expected_left = btreeset ! {
218
- KeyMap {
219
- key: "b" . to_string( ) ,
220
- children: Some ( btreeset! {
221
- KeyMap {
222
- key: "c" . to_string( ) ,
223
- children: Some ( btreeset! {
224
- KeyMap {
225
- key: "f" . to_string( ) ,
226
- children: None ,
227
- } ,
228
- KeyMap {
229
- key: "h" . to_string( ) ,
230
- children: Some ( btreeset! {
231
- KeyMap {
232
- key: "j" . to_string( ) ,
233
- children: None ,
214
+ let expected_left = KeyMap {
215
+ keys : hashmap ! {
216
+ "b" . to_string( ) => Some ( KeyMap {
217
+ keys: hashmap! {
218
+ "c" . to_string( ) => Some ( KeyMap {
219
+ keys: hashmap! {
220
+ "f" . to_string( ) => None ,
221
+ "h" . to_string( ) => Some ( KeyMap {
222
+ keys: hashmap! {
223
+ "j" . to_string( ) => None ,
234
224
}
235
225
} )
236
226
}
237
227
} )
238
228
}
239
229
} )
240
- }
230
+ } ,
241
231
} ;
242
- let expected_right = btreeset ! {
243
- KeyMap {
244
- key: "b" . to_string( ) ,
245
- children: Some ( btreeset! {
246
- KeyMap {
247
- key: "c" . to_string( ) ,
248
- children: Some ( btreeset! {
249
- KeyMap {
250
- key: "g" . to_string( ) ,
251
- children: None ,
252
- } ,
253
- KeyMap {
254
- key: "h" . to_string( ) ,
255
- children: Some ( btreeset! {
256
- KeyMap {
257
- key: "k" . to_string( ) ,
258
- children: None ,
232
+
233
+ let expected_right = KeyMap {
234
+ keys : hashmap ! {
235
+ "b" . to_string( ) => Some ( KeyMap {
236
+ keys: hashmap! {
237
+ "c" . to_string( ) => Some ( KeyMap {
238
+ keys: hashmap! {
239
+ "g" . to_string( ) => None ,
240
+ "h" . to_string( ) => Some ( KeyMap {
241
+ keys: hashmap! {
242
+ "k" . to_string( ) => None ,
259
243
}
260
244
} )
261
245
}
262
246
} )
263
247
}
264
248
} )
265
- }
249
+ } ,
266
250
} ;
267
- let expected_uneq = btreeset ! {
268
- KeyMap {
269
- key: "b" . to_string( ) ,
270
- children: Some ( btreeset! {
271
- KeyMap {
272
- key: "c" . to_string( ) ,
273
- children: Some ( btreeset! {
274
- KeyMap {
275
- key: "e" . to_string( ) ,
276
- children: None ,
277
- } ,
278
- KeyMap {
279
- key: "h" . to_string( ) ,
280
- children: Some ( btreeset! {
281
- KeyMap {
282
- key: "i" . to_string( ) ,
283
- children: None ,
251
+
252
+ let expected_uneq = KeyMap {
253
+ keys : hashmap ! {
254
+ "b" . to_string( ) => Some ( KeyMap {
255
+ keys: hashmap! {
256
+ "c" . to_string( ) => Some ( KeyMap {
257
+ keys: hashmap! {
258
+ "e" . to_string( ) => None ,
259
+ "h" . to_string( ) => Some ( KeyMap {
260
+ keys: hashmap! {
261
+ "i" . to_string( ) => None ,
284
262
}
285
263
} )
286
264
}
287
265
} )
288
266
}
289
267
} )
290
- }
268
+ } ,
291
269
} ;
292
270
293
271
assert_eq ! ( a, expected_left, "Left was incorrect." ) ;
0 commit comments