fn diff()

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
}