diff options
author | Michal 'vorner' Vaner <vorner@vorner.cz> | 2018-12-30 19:06:28 +0100 |
---|---|---|
committer | Michal 'vorner' Vaner <vorner@vorner.cz> | 2018-12-30 19:06:28 +0100 |
commit | 85f9735978433c9d49a24f51fa76b28f45beeb7c (patch) | |
tree | 29c4d09169f08df2597f985efcfaf71267cc16e6 /src/de.rs | |
parent | 2eca1ad50c899f52c7a589105180f85817f94049 (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.rs | 15 |
1 files changed, 11 insertions, 4 deletions
@@ -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)) } } |