summaryrefslogtreecommitdiffstats
path: root/src/config.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/config.rs')
-rw-r--r--src/config.rs30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/config.rs b/src/config.rs
index 35cb86563..e0aa016ac 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -48,7 +48,17 @@ impl<'a, T: Deserialize<'a> + Default> ModuleConfig<'a, ValueError> for T {
/// Create `ValueDeserializer` wrapper and use it to call `Deserialize::deserialize` on it.
fn from_config(config: &'a Value) -> Result<Self, ValueError> {
let deserializer = ValueDeserializer::new(config);
- T::deserialize(deserializer)
+ T::deserialize(deserializer).or_else(|err| {
+ // If the error is an unrecognized key, print a warning and run
+ // deserialize ignoring that error. Otherwise, just return the error
+ if err.to_string().contains("Unknown key") {
+ log::warn!("{}", err);
+ let deserializer2 = ValueDeserializer::new(config).with_allow_unknown_keys();
+ T::deserialize(deserializer2)
+ } else {
+ Err(err)
+ }
+ })
}
}
@@ -583,6 +593,24 @@ mod tests {
}
#[test]
+ fn test_load_unknown_key_config() {
+ #[derive(Clone, Default, Deserialize)]
+ #[serde(default)]
+ struct TestConfig<'a> {
+ pub foo: &'a str,
+ }
+
+ let config = toml::toml! {
+ foo = "test"
+ bar = "ignore me"
+ };
+ let rust_config = TestConfig::from_config(&config);
+
+ assert!(rust_config.is_ok());
+ assert_eq!(rust_config.unwrap().foo, "test");
+ }
+
+ #[test]
fn test_from_string() {
let config = Value::String(String::from("S"));
assert_eq!(<&str>::from_config(&config).unwrap(), "S");