yabe/
deep_equal.rs

1use yaml_rust2::Yaml;
2
3/// Recursively checks if two Yaml values are deeply equal.
4pub fn deep_equal(a: &Yaml, b: &Yaml) -> bool {
5    match (a, b) {
6        (Yaml::Real(a_str), Yaml::Real(b_str)) => a_str == b_str,
7        (Yaml::Integer(a_int), Yaml::Integer(b_int)) => a_int == b_int,
8        (Yaml::String(a_str), Yaml::String(b_str)) => a_str == b_str,
9        (Yaml::Boolean(a_bool), Yaml::Boolean(b_bool)) => a_bool == b_bool,
10        (Yaml::Array(a_vec), Yaml::Array(b_vec)) => {
11            if a_vec.len() != b_vec.len() {
12                false
13            } else {
14                a_vec.iter().zip(b_vec.iter()).all(|(a_item, b_item)| deep_equal(a_item, b_item))
15            }
16        }
17        (Yaml::Hash(a_hash), Yaml::Hash(b_hash)) => {
18            if a_hash.len() != b_hash.len() {
19                false
20            } else {
21                a_hash.iter().all(|(a_key, a_value)| {
22                    b_hash.get(a_key).map_or(false, |b_value| deep_equal(a_value, b_value))
23                })
24            }
25        }
26        (Yaml::Null, Yaml::Null) => true,
27        _ => false,
28    }
29}