diff --git a/cli/src/main.rs b/cli/src/main.rs index 36b93c5..d19e20b 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -122,7 +122,9 @@ fn main() -> io::Result<()> { let settings = { let mut settings = if let Some(path) = opt.settings { - serde_json::from_reader(File::open(path)?)? + let defaults = serde_json::to_value(Settings::default()).unwrap(); + let overrides = serde_json::from_reader(File::open(path)?)?; + serde_json::from_value(merge(defaults, overrides))? } else { Settings::default() }; @@ -384,3 +386,16 @@ fn main() -> io::Result<()> { ) } } + +fn merge(defaults: serde_json::Value, overrides: serde_json::Value) -> serde_json::Value { + match (defaults, overrides) { + (serde_json::Value::Object(mut defaults), serde_json::Value::Object(overrides)) => { + for (k, v) in overrides { + let existing = defaults.remove(&k).unwrap_or(serde_json::Value::Null); + defaults.insert(k, merge(existing, v)); + } + serde_json::Value::Object(defaults) + } + (_, overrides) => overrides, + } +}