From 5eef2539557b9d4eec72c7053457bf3025a3989e Mon Sep 17 00:00:00 2001 From: Ryan Leckey Date: Sat, 3 Jun 2017 01:22:24 -0700 Subject: More context for errors (value key if possible) --- src/error.rs | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) (limited to 'src/error.rs') diff --git a/src/error.rs b/src/error.rs index 8af5cee..92709c2 100644 --- a/src/error.rs +++ b/src/error.rs @@ -50,12 +50,13 @@ pub enum ConfigError { origin: Option, unexpected: Unexpected, expected: &'static str, + key: Option, }, /// Custom message Message(String), - /// Unadorned error from a foreign source. + /// Unadorned error from a foreign origin. Foreign(Box), } @@ -66,9 +67,27 @@ impl ConfigError { ConfigError::Type { origin: origin, unexpected: unexpected, - expected: expected + expected: expected, + key: None, } } + + // FIXME: pub(crate) + #[doc(hidden)] + pub fn extend_with_key(self, key: &str) -> Self { + match self { + ConfigError::Type { origin, unexpected, expected, .. } => { + ConfigError::Type { + origin: origin, + unexpected: unexpected, + expected: expected, + key: Some(key.into()), + } + } + + _ => self, + } + } } /// Alias for a `Result` with the error type set to `ConfigError`. @@ -100,12 +119,16 @@ impl fmt::Display for ConfigError { write!(f, "configuration property {:?} not found", key) } - ConfigError::Type { ref origin, ref unexpected, expected } => { + ConfigError::Type { ref origin, ref unexpected, expected, ref key } => { write!(f, "invalid type: {}, expected {}", unexpected, expected)?; + if let Some(ref key) = *key { + write!(f, " for key `{}`", key)?; + } + if let Some(ref origin) = *origin { - write!(f, " from {}", origin)?; + write!(f, " in {}", origin)?; } Ok(()) @@ -115,7 +138,7 @@ impl fmt::Display for ConfigError { write!(f, "{}", cause)?; if let Some(ref uri) = *uri { - write!(f, " from {}", uri)?; + write!(f, " in {}", uri)?; } Ok(()) -- cgit v1.2.3