Skip to content

Commit c94aac0

Browse files
committed
Fix recursive diff for arrays in objects
1 parent 897b103 commit c94aac0

File tree

2 files changed

+30
-15
lines changed

2 files changed

+30
-15
lines changed

src/line.rs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,26 @@ impl Line {
2424
contents,
2525
}
2626
}
27+
}
28+
29+
pub enum WrapperKind {
30+
Array,
31+
Object,
32+
}
2733

28-
pub fn wrap(lines: Vec<Line>, name: &str) -> Vec<Line> {
29-
let mut result: Vec<Line> = vec![];
30-
if !lines.is_empty() {
31-
result.push(Line::new('.', format!("{}{{", name)));
32-
for mut line in lines {
33-
line.depth += 1;
34-
result.push(line);
35-
}
36-
result.push(Line::new('.', "}".to_owned()));
34+
pub fn wrap(lines: Vec<Line>, name: &str, kind: WrapperKind) -> Vec<Line> {
35+
let (d1, d2) = match kind {
36+
WrapperKind::Array => ('[', ']'),
37+
WrapperKind::Object => ('{', '}'),
38+
};
39+
let mut result: Vec<Line> = vec![];
40+
if !lines.is_empty() {
41+
result.push(Line::new('.', format!("{}{}", name, d1)));
42+
for mut line in lines {
43+
line.depth += 1;
44+
result.push(line);
3745
}
38-
result
46+
result.push(Line::new('.', format!("{}", d2)));
3947
}
48+
result
4049
}

src/parser.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use serde_json::{self, Map, Value};
44

55
use util::zip_to_end;
66

7-
use line::Line;
7+
use line::{wrap, Line, WrapperKind};
88

99
//
1010
// Entrypoint function
@@ -31,9 +31,15 @@ fn diff_obj(a: &Map<String, Value>, b: &Map<String, Value>) -> Vec<Line> {
3131
.iter()
3232
.flat_map(|(key, val)| match b2.remove(key) {
3333
Some(ref bval) if val == bval => vec![Line::new('x', String::new())],
34-
Some(ref bval) if val.is_object() && bval.is_object() => Line::wrap(
34+
Some(ref bval) if val.is_object() && bval.is_object() => wrap(
3535
diff(val, &bval).expect("Invalid input"),
3636
&format!("\"{}\": ", key),
37+
WrapperKind::Object,
38+
),
39+
Some(ref bval) if val.is_array() && bval.is_array() => wrap(
40+
diff(val, &bval).expect("Invalid input"),
41+
&format!("\"{}\": ", key),
42+
WrapperKind::Array,
3743
),
3844
Some(bval) => vec![Line::new('~', format!(r#""{}": {} => {}"#, key, val, bval))],
3945
_ => vec![Line::new('-', format!(r#""{}": {}"#, key, val))],
@@ -51,9 +57,9 @@ fn diff_array(a: &[Value], b: &[Value]) -> Vec<Line> {
5157
let zip = zip_to_end(a.to_vec(), b.to_vec());
5258
zip.iter()
5359
.flat_map(|(a, b)| match (a, b) {
54-
(Some(a), Some(b)) => Line::wrap(diff(a, b).unwrap(), ""),
55-
(Some(a), None) => Line::wrap(diff(a, &empty_map).unwrap(), ""),
56-
(None, Some(b)) => Line::wrap(diff(&empty_map, b).unwrap(), ""),
60+
(Some(a), Some(b)) => wrap(diff(a, b).unwrap(), "", WrapperKind::Object),
61+
(Some(a), None) => wrap(diff(a, &empty_map).unwrap(), "", WrapperKind::Object),
62+
(None, Some(b)) => wrap(diff(&empty_map, b).unwrap(), "", WrapperKind::Object),
5763
_ => vec![],
5864
}).collect()
5965
} else {

0 commit comments

Comments
 (0)