summaryrefslogtreecommitdiffstats
path: root/src/de.rs
diff options
context:
space:
mode:
authorMichal 'vorner' Vaner <vorner@vorner.cz>2018-12-30 19:06:28 +0100
committerMichal 'vorner' Vaner <vorner@vorner.cz>2018-12-30 19:06:28 +0100
commit85f9735978433c9d49a24f51fa76b28f45beeb7c (patch)
tree29c4d09169f08df2597f985efcfaf71267cc16e6 /src/de.rs
parent2eca1ad50c899f52c7a589105180f85817f94049 (diff)
Tracking a path where an error happens during deserialization
Related to #83, but doesn't solve that specific problem :-(. That specific error message ("missing field") comes from somewhere else than this library.
Diffstat (limited to 'src/de.rs')
-rw-r--r--src/de.rs15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/de.rs b/src/de.rs
index 9ebe2e4..9267338 100644
--- a/src/de.rs
+++ b/src/de.rs
@@ -2,6 +2,7 @@ use config::Config;
use error::*;
use serde::de;
use std::collections::{HashMap, VecDeque};
+use std::iter::Enumerate;
use value::{Value, ValueKind, ValueWithKey, Table};
// TODO: Use a macro or some other magic to reduce the code duplication here
@@ -284,13 +285,13 @@ impl<'de, 'a> de::Deserializer<'de> for StrDeserializer<'a> {
}
struct SeqAccess {
- elements: ::std::vec::IntoIter<Value>,
+ elements: Enumerate<::std::vec::IntoIter<Value>>,
}
impl SeqAccess {
fn new(elements: Vec<Value>) -> Self {
SeqAccess {
- elements: elements.into_iter(),
+ elements: elements.into_iter().enumerate(),
}
}
}
@@ -303,7 +304,11 @@ impl<'de> de::SeqAccess<'de> for SeqAccess {
T: de::DeserializeSeed<'de>,
{
match self.elements.next() {
- Some(value) => seed.deserialize(value).map(Some),
+ Some((idx, value)) => {
+ seed.deserialize(value)
+ .map(Some)
+ .map_err(|e| e.prepend_index(idx))
+ }
None => Ok(None),
}
}
@@ -349,7 +354,9 @@ impl<'de> de::MapAccess<'de> for MapAccess {
where
V: de::DeserializeSeed<'de>,
{
- de::DeserializeSeed::deserialize(seed, self.elements.pop_front().unwrap().1)
+ let (key, value) = self.elements.pop_front().unwrap();
+ de::DeserializeSeed::deserialize(seed, value)
+ .map_err(|e| e.prepend_key(key))
}
}