Skip to content

Commit 00c102b

Browse files
committed
Represent keys as sets
1 parent 6fdcf27 commit 00c102b

File tree

1 file changed

+27
-23
lines changed

1 file changed

+27
-23
lines changed

src/main.rs

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use serde_json;
22
use serde_json::Map;
33
use serde_json::Value;
4+
use std::collections::BTreeSet;
45

56
fn main() {
67
let data = r#"{
@@ -55,44 +56,47 @@ fn main() {
5556
}
5657
}
5758

59+
#[derive(Eq, PartialEq, Ord, PartialOrd, Debug)]
60+
struct KeyMap {
61+
key: String,
62+
children: Option<BTreeSet<KeyMap>>,
63+
}
64+
5865
enum Mismatch {
5966
NoMismatch,
6067
ValueMismatch,
61-
ObjectMismatch(Option<Vec<String>>, Option<Vec<String>>, Option<Vec<String>>),
68+
ObjectMismatch(Option<BTreeSet<KeyMap>>, Option<BTreeSet<KeyMap>>, Option<BTreeSet<KeyMap>>),
6269
}
6370

6471
fn match_json(value: &Value, value1: &Value) -> Mismatch {
6572
match (value, value1) {
6673
(Value::Object(a), Value::Object(b)) => {
67-
let (mut left, mut right, intersection) = intersect_maps(&a, &b);
68-
let mut unequal_keys = vec![];
74+
let (left, right, intersection) = intersect_maps(&a, &b);
75+
let mut unequal_keys = BTreeSet::new();
76+
77+
let mut left = left.iter().map(|x| KeyMap{ key: String::from(x), children: None }).collect::<BTreeSet<KeyMap>>();
78+
let mut right = right.iter().map(|x| KeyMap{ key: String::from(x), children: None }).collect::<BTreeSet<KeyMap>>();
6979

7080
for key in intersection {
71-
let append_key = |x: &String| {
72-
let mut n = String::from(&key);
73-
n.push('.');
74-
n.push_str(x);
75-
n.to_string()
76-
};
7781
let x = match_json(&a.get(&key).unwrap(), &b.get(&key).unwrap());
78-
if let Some(mut keys) = match x {
82+
if let Some(keys) = match x {
7983
Mismatch::NoMismatch => None,
80-
Mismatch::ValueMismatch => Some(vec![key]),
84+
Mismatch::ValueMismatch => Some(KeyMap{ key, children: None }),
8185
Mismatch::ObjectMismatch(left_keys, right_keys, mismatch_keys) => {
8286
if let Some(left_keys) = left_keys {
83-
left.append(&mut left_keys.iter().map(append_key).collect::<Vec<String>>());
87+
left.insert(KeyMap{ key: String::from(&key), children: Some(left_keys) });
8488
}
8589
if let Some(right_keys) = right_keys {
86-
right.append(&mut right_keys.iter().map(append_key).collect::<Vec<String>>());
90+
right.insert(KeyMap{ key: String::from(&key), children: Some(right_keys) });
8791
}
8892
if let Some(mismatch_keys) = mismatch_keys {
89-
Some(mismatch_keys.iter().map(append_key).collect::<Vec<String>>())
93+
Some(KeyMap{ key: String::from(&key), children: Some(mismatch_keys) })
9094
} else {
9195
None
9296
}
9397
},
9498
} {
95-
unequal_keys.append(&mut keys);
99+
unequal_keys.insert(keys);
96100
}
97101
}
98102
Mismatch::ObjectMismatch(Some(left), Some(right), Some(unequal_keys))
@@ -108,21 +112,21 @@ fn match_json(value: &Value, value1: &Value) -> Mismatch {
108112
}
109113

110114
fn intersect_maps<'a>(a: &Map<String, Value>,
111-
b: &Map<String, Value>) -> (Vec<String>,
112-
Vec<String>, Vec<String>) {
113-
let mut intersection = vec![];
114-
let mut left = vec![];
115-
let mut right = vec![];
115+
b: &Map<String, Value>) -> (BTreeSet<String>,
116+
BTreeSet<String>, BTreeSet<String>) {
117+
let mut intersection = BTreeSet::new();
118+
let mut left = BTreeSet::new();
119+
let mut right = BTreeSet::new();
116120
for a_key in a.keys() {
117121
if b.contains_key(a_key) {
118-
intersection.push(String::from(a_key));
122+
intersection.insert(String::from(a_key));
119123
} else {
120-
left.push(String::from(a_key));
124+
left.insert(String::from(a_key));
121125
}
122126
}
123127
for b_key in b.keys() {
124128
if !a.contains_key(b_key) {
125-
right.push(String::from(b_key));
129+
right.insert(String::from(b_key));
126130
}
127131
}
128132
(left, right, intersection)

0 commit comments

Comments
 (0)