summaryrefslogtreecommitdiffstats
path: root/src/de.rs
diff options
context:
space:
mode:
authorMichal 'vorner' Vaner <vorner@vorner.cz>2018-12-30 15:55:35 +0100
committerMichal 'vorner' Vaner <vorner@vorner.cz>2018-12-30 15:55:35 +0100
commit2eca1ad50c899f52c7a589105180f85817f94049 (patch)
treec091829ffe35e4fdbab46bee95de209e052df5ec /src/de.rs
parent05bc8dee889dd95663a3441bd58fb5abdf322d9e (diff)
Deserializing: Simplify the MapAccess thing
Diffstat (limited to 'src/de.rs')
-rw-r--r--src/de.rs30
1 files changed, 12 insertions, 18 deletions
diff --git a/src/de.rs b/src/de.rs
index e465d60..9ebe2e4 100644
--- a/src/de.rs
+++ b/src/de.rs
@@ -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)
}
}