use yaml_rust2::Yaml;
pub(super) fn resolve_merges(value: &Yaml) -> Yaml {
match value {
Yaml::Hash(entries) => {
let mut own = Vec::new();
let mut sources = Vec::new();
for (key, value) in entries {
if key.as_str() == Some("<<") {
match value {
Yaml::Array(items) => sources.extend(items.iter().map(resolve_merges)),
other => sources.push(resolve_merges(other)),
}
continue;
}
own.push((key.clone(), resolve_merges(value)));
}
let mut merged = yaml_rust2::yaml::Hash::new();
for source in sources {
if let Yaml::Hash(fields) = source {
for (key, value) in fields {
merged.entry(key).or_insert(value);
}
}
}
for (key, value) in own {
merged.insert(key, value);
}
Yaml::Hash(merged)
}
Yaml::Array(items) => Yaml::Array(items.iter().map(resolve_merges).collect()),
other => other.clone(),
}
}