in edge-modules/api-proxy-module/rust-sdk/azure-iot-mqtt/src/twin_state/reported.rs [333:384]
fn diff(
previous: &std::collections::HashMap<String, serde_json::Value>,
current: &std::collections::HashMap<String, serde_json::Value>,
) -> std::collections::HashMap<String, serde_json::Value> {
fn diff_inner(previous: &serde_json::Value, current: &serde_json::Value) -> serde_json::Value {
match (previous, current) {
(serde_json::Value::Object(previous), serde_json::Value::Object(current)) => {
let mut result: serde_json::Map<_, _> = Default::default();
for (key, previous_value) in previous {
if let Some(current_value) = current.get(key) {
if previous_value != current_value {
result.insert(key.clone(), diff_inner(previous_value, current_value));
}
} else {
result.insert(key.clone(), serde_json::Value::Null);
}
}
for (key, current_value) in current {
if !previous.contains_key(key) {
result.insert(key.clone(), current_value.clone());
}
}
serde_json::Value::Object(result)
}
(_, _) => current.clone(),
}
}
let mut result: std::collections::HashMap<_, _> = Default::default();
for (key, previous_value) in previous {
if let Some(current_value) = current.get(key) {
if previous_value != current_value {
result.insert(key.clone(), diff_inner(previous_value, current_value));
}
} else {
result.insert(key.clone(), serde_json::Value::Null);
}
}
for (key, current_value) in current {
if !previous.contains_key(key) {
result.insert(key.clone(), current_value.clone());
}
}
result
}