Diff two JSON arrays element-by-element. For short arrays or same-length arrays, diffs per index. For length changes, emits ArrayInsert/ArrayRemove for trailing elements.
(
diffs: &mut Vec<FieldDiff>,
prefix: &str,
old_arr: &[serde_json::Value],
new_arr: &[serde_json::Value],
)
| 238 | /// For short arrays or same-length arrays, diffs per index. |
| 239 | /// For length changes, emits ArrayInsert/ArrayRemove for trailing elements. |
| 240 | fn diff_arrays( |
| 241 | diffs: &mut Vec<FieldDiff>, |
| 242 | prefix: &str, |
| 243 | old_arr: &[serde_json::Value], |
| 244 | new_arr: &[serde_json::Value], |
| 245 | ) { |
| 246 | let min_len = old_arr.len().min(new_arr.len()); |
| 247 | |
| 248 | // Compare overlapping elements. |
| 249 | for i in 0..min_len { |
| 250 | let path = format!("{prefix}[{i}]"); |
| 251 | diff_values(diffs, &path, &old_arr[i], &new_arr[i]); |
| 252 | } |
| 253 | |
| 254 | // Elements removed from old (old is longer). |
| 255 | for (i, item) in old_arr.iter().enumerate().skip(min_len) { |
| 256 | let path = format!("{prefix}[{i}]"); |
| 257 | diffs.push(FieldDiff { |
| 258 | field: path, |
| 259 | op: DiffOp::ArrayRemove, |
| 260 | old_value: Some(item.clone()), |
| 261 | new_value: None, |
| 262 | }); |
| 263 | } |
| 264 | |
| 265 | // Elements added in new (new is longer). |
| 266 | for (i, item) in new_arr.iter().enumerate().skip(min_len) { |
| 267 | let path = format!("{prefix}[{i}]"); |
| 268 | diffs.push(FieldDiff { |
| 269 | field: path, |
| 270 | op: DiffOp::ArrayInsert, |
| 271 | old_value: None, |
| 272 | new_value: Some(item.clone()), |
| 273 | }); |
| 274 | } |
| 275 | } |
| 276 | |
| 277 | /// Diff two strings, producing TextInsert/TextDelete for simple edits |
| 278 | /// or Modified for complex changes. |
no test coverage detected