#![deny(missing_docs)]
mod value;
mod diff;
pub use value::Value;
use std::collections::HashMap;
use crate::diff::{HashChangeType, KeyValuePair};
pub use diff::HashMapDiff;
pub fn compare_hash_map<'a>(
left_map: &'a HashMap<String, Value>,
right_map: &'a HashMap<String, Value>,
) -> HashMapDiff {
let mut right = vec![];
let mut left = vec![];
for (key, value) in left_map.clone() {
if !right_map.contains_key(key.as_str()) {
right.push(HashChangeType::Remove(key.clone()));
left.push(HashChangeType::Insert(KeyValuePair {
key: key.clone(),
value: value.clone(),
}));
} else if &value != right_map.get(key.as_str()).unwrap() {
right.push(HashChangeType::Change(KeyValuePair {
key: key.clone(),
value: right_map.get(key.as_str()).unwrap().clone(),
}));
}
}
for (key, value) in right_map.clone() {
if !left_map.contains_key(key.as_str()) {
right.push(HashChangeType::Insert(KeyValuePair {
key: key.clone(),
value: value.clone(),
}));
} else if &value != left_map.get(key.as_str()).unwrap() {
left.push(HashChangeType::Change(KeyValuePair {
key: key.clone(),
value: left_map.get(key.as_str()).unwrap().clone(),
}));
}
}
HashMapDiff {
left,
right,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn diff_hashmap_test() {
let left = [("unchanged".to_string(), 1.into()), ("removed".to_string(), 2.into()), ("changed".to_string(), Value::Int(3))].into();
let right = [("unchanged".into(), "1".into()), ("changed".into(), 5.into()), ("added".into(), 4.into())].into();
let diff = compare_hash_map(&left, &right);
println!("{:#?}", diff);
}
}