diff options
author | Michal 'vorner' Vaner <vorner@vorner.cz> | 2018-12-30 15:55:35 +0100 |
---|---|---|
committer | Michal 'vorner' Vaner <vorner@vorner.cz> | 2018-12-30 15:55:35 +0100 |
commit | 2eca1ad50c899f52c7a589105180f85817f94049 (patch) | |
tree | c091829ffe35e4fdbab46bee95de209e052df5ec | |
parent | 05bc8dee889dd95663a3441bd58fb5abdf322d9e (diff) |
Deserializing: Simplify the MapAccess thing
-rw-r--r-- | src/de.rs | 30 |
1 files changed, 12 insertions, 18 deletions
@@ -1,10 +1,7 @@ use config::Config; use error::*; use serde::de; -use std::borrow::Cow; -use std::collections::hash_map::Drain; -use std::collections::HashMap; -use std::iter::Peekable; +use std::collections::{HashMap, VecDeque}; use value::{Value, ValueKind, ValueWithKey, Table}; // TODO: Use a macro or some other magic to reduce the code duplication here @@ -320,15 +317,13 @@ impl<'de> de::SeqAccess<'de> for SeqAccess { } struct MapAccess { - elements: Vec<(String, Value)>, - index: usize, + elements: VecDeque<(String, Value)>, } impl MapAccess { - fn new(mut table: HashMap<String, Value>) -> Self { + fn new(table: HashMap<String, Value>) -> Self { MapAccess { - elements: table.drain().collect(), - index: 0, + elements: table.into_iter().collect(), } } } @@ -340,22 +335,21 @@ impl<'de> de::MapAccess<'de> for MapAccess { where K: de::DeserializeSeed<'de>, { - if self.index >= self.elements.len() { - return Ok(None); - } - - let key_s = &(self.elements[0].0); - let key_de = StrDeserializer(key_s); - let key = de::DeserializeSeed::deserialize(seed, key_de)?; + if let Some(&(ref key_s, _)) = self.elements.front() { + let key_de = StrDeserializer(key_s); + let key = de::DeserializeSeed::deserialize(seed, key_de)?; - Ok(Some(key)) + Ok(Some(key)) + } else { + Ok(None) + } } fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value> where V: de::DeserializeSeed<'de>, { - de::DeserializeSeed::deserialize(seed, self.elements.remove(0).1) + de::DeserializeSeed::deserialize(seed, self.elements.pop_front().unwrap().1) } } |