Diff two JSON objects field-by-field.
(
diffs: &mut Vec<FieldDiff>,
prefix: &str,
old_map: &serde_json::Map<String, serde_json::Value>,
new_map: &serde_json::Map<String, serde_json::Value>,
)
| 190 | |
| 191 | /// Diff two JSON objects field-by-field. |
| 192 | fn diff_objects( |
| 193 | diffs: &mut Vec<FieldDiff>, |
| 194 | prefix: &str, |
| 195 | old_map: &serde_json::Map<String, serde_json::Value>, |
| 196 | new_map: &serde_json::Map<String, serde_json::Value>, |
| 197 | ) { |
| 198 | // Fields in old that are modified or removed in new. |
| 199 | for (key, old_val) in old_map { |
| 200 | let path = if prefix.is_empty() { |
| 201 | key.clone() |
| 202 | } else { |
| 203 | format!("{prefix}.{key}") |
| 204 | }; |
| 205 | match new_map.get(key) { |
| 206 | Some(new_val) => diff_values(diffs, &path, old_val, new_val), |
| 207 | None => { |
| 208 | diffs.push(FieldDiff { |
| 209 | field: path, |
| 210 | op: DiffOp::Removed, |
| 211 | old_value: Some(old_val.clone()), |
| 212 | new_value: None, |
| 213 | }); |
| 214 | } |
| 215 | } |
| 216 | } |
| 217 | |
| 218 | // Fields in new that were added (not in old). |
| 219 | for (key, new_val) in new_map { |
| 220 | if !old_map.contains_key(key) { |
| 221 | let path = if prefix.is_empty() { |
| 222 | key.clone() |
| 223 | } else { |
| 224 | format!("{prefix}.{key}") |
| 225 | }; |
| 226 | diffs.push(FieldDiff { |
| 227 | field: path, |
| 228 | op: DiffOp::Added, |
| 229 | old_value: None, |
| 230 | new_value: Some(new_val.clone()), |
| 231 | }); |
| 232 | } |
| 233 | } |
| 234 | } |
| 235 | |
| 236 | /// Diff two JSON arrays element-by-element. |
| 237 | /// |
no test coverage detected