diff --git a/Cargo.lock b/Cargo.lock index 103212dc7..e2c38d623 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2036,6 +2036,7 @@ dependencies = [ "self_update", "serde", "serde_derive", + "serde_ignored", "serde_json", "sha2", "shell-escape", @@ -3210,6 +3211,15 @@ dependencies = [ "syn 2.0.75", ] +[[package]] +name = "serde_ignored" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8e319a36d1b52126a0d608f24e93b2d81297091818cd70625fcf50a15d84ddf" +dependencies = [ + "serde", +] + [[package]] name = "serde_json" version = "1.0.125" diff --git a/Cargo.toml b/Cargo.toml index 33ecad407..efe3aba5b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -94,6 +94,7 @@ self_update = { version = "0.41", default-features = false, features = [ ] } serde = "1.0.199" serde_derive = "1.0.199" +serde_ignored = "0.1" serde_json = { version = "1.0.116", features = [] } sha2 = "0.10.8" shell-escape = "0.1.5" diff --git a/src/config/config_file/mise_toml.rs b/src/config/config_file/mise_toml.rs index 34570a6eb..58d8dcc81 100644 --- a/src/config/config_file/mise_toml.rs +++ b/src/config/config_file/mise_toml.rs @@ -26,7 +26,6 @@ use crate::toolset::{ToolRequest, ToolRequestSet, ToolSource, ToolVersionOptions use crate::{dirs, file}; #[derive(Default, Deserialize)] -#[serde(deny_unknown_fields)] pub struct MiseToml { #[serde(default, deserialize_with = "deserialize_version")] min_version: Option, @@ -85,7 +84,10 @@ impl MiseToml { pub fn from_file(path: &Path) -> eyre::Result { trace!("parsing: {}", display_path(path)); let body = file::read_to_string(path)?; - let mut rf: MiseToml = toml::from_str(&body)?; + let des = toml::Deserializer::new(&body); + let mut rf: MiseToml = serde_ignored::deserialize(des, |p| { + warn!("unknown field in {}: {p}", display_path(path)); + })?; rf.context = BASE_CONTEXT.clone(); rf.context .insert("config_root", path.parent().unwrap().to_str().unwrap()); @@ -1159,15 +1161,6 @@ mod tests { assert_debug_snapshot!(cf); } - #[test] - fn test_fail_with_unknown_key() { - reset(); - let _ = toml::from_str::(&formatdoc! {r#" - invalid_key = true - "#}) - .unwrap_err(); - } - #[test] fn test_env_entries() { reset(); diff --git a/src/config/settings.rs b/src/config/settings.rs index 946d3f7fb..57a25309c 100644 --- a/src/config/settings.rs +++ b/src/config/settings.rs @@ -19,7 +19,6 @@ use crate::{config, dirs, env, file}; #[rustfmt::skip] #[derive(Config, Default, Debug, Clone, Serialize)] #[config(partial_attr(derive(Clone, Serialize, Default)))] -#[config(partial_attr(serde(deny_unknown_fields)))] pub struct Settings { /// push tools to the front of PATH instead of allowing modifications of PATH after activation to take precedence #[config(env = "MISE_ACTIVATE_AGGRESSIVE", default = false)]