use crate::key_aliases::normalize_key_aliases; use crate::key_aliases::normalized_with_key_aliases; use toml::Value as TomlValue; /// Merge config `overlay` into `base`, giving `overlay` precedence. pub fn merge_toml_values(base: &mut TomlValue, overlay: &TomlValue) { merge_toml_values_at_path(base, overlay, &mut Vec::new()); } fn merge_toml_values_at_path(base: &mut TomlValue, overlay: &TomlValue, path: &mut Vec) { if let TomlValue::Table(overlay_table) = overlay && let TomlValue::Table(base_table) = base { normalize_key_aliases(path, base_table); let mut overlay_table = overlay_table.clone(); normalize_key_aliases(path, &mut overlay_table); for (key, value) in overlay_table { path.push(key.clone()); if let Some(existing) = base_table.get_mut(&key) { merge_toml_values_at_path(existing, &value, path); } else { base_table.insert(key, normalized_with_key_aliases(&value, path)); } path.pop(); } } else { *base = normalized_with_key_aliases(overlay, path); } } #[cfg(test)] #[path = "merge_tests.rs"] mod tests;