diff_hashmap_list 0.0.1

This crate is diff tool for HashMap.
Documentation
//! This crate is websocket tool for salvo.
#![deny(missing_docs)]

mod value;
mod diff;

pub use value::Value;
use std::collections::HashMap;
use crate::diff::{HashChangeType, KeyValuePair};
pub use diff::HashMapDiff;

/// HashMap Compare Function
///
/// ## Example
/// ```
/// use diff_hashmap_list::{compare_hash_map, Value};
///
/// 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);
/// }
/// ```
///
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()) {
            // left.push(HashChangeType::Remove(key.clone()));
            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);
    }
}