MCPcopy Create free account
hub / github.com/NodeDB-Lab/nodedb / diff_arrays

Function diff_arrays

nodedb/src/event/field_diff.rs:240–275  ·  view source on GitHub ↗

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],
)

Source from the content-addressed store, hash-verified

238/// For short arrays or same-length arrays, diffs per index.
239/// For length changes, emits ArrayInsert/ArrayRemove for trailing elements.
240fn 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.

Callers 1

diff_valuesFunction · 0.85

Calls 5

diff_valuesFunction · 0.85
lenMethod · 0.45
iterMethod · 0.45
pushMethod · 0.45
cloneMethod · 0.45

Tested by

no test coverage detected