summaryrefslogtreecommitdiffstats
path: root/lib/src/de.rs
diff options
context:
space:
mode:
Diffstat (limited to 'lib/src/de.rs')
-rw-r--r--lib/src/de.rs216
1 files changed, 25 insertions, 191 deletions
diff --git a/lib/src/de.rs b/lib/src/de.rs
index a59d950..369d6de 100644
--- a/lib/src/de.rs
+++ b/lib/src/de.rs
@@ -1,6 +1,7 @@
use serde::de;
use value::{Value, ValueKind};
use error::*;
+use std::borrow::Cow;
use std::iter::Peekable;
use std::collections::HashMap;
use std::collections::hash_map::Drain;
@@ -9,177 +10,36 @@ impl de::Deserializer for Value {
type Error = ConfigError;
#[inline]
- fn deserialize<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
+ fn deserialize<V>(self, visitor: V) -> Result<V::Value>
+ where V: de::Visitor,
+ {
// Deserialize based on the underlying type
match self.kind {
- ValueKind::Boolean(value) => {
- visitor.visit_bool(value)
- }
-
- ValueKind::Table(map) => {
- visitor.visit_map(MapVisitor::new(map))
- }
-
+ ValueKind::Integer(i) => visitor.visit_i64(i),
+ ValueKind::Boolean(b) => visitor.visit_bool(b),
+ ValueKind::Float(f) => visitor.visit_f64(f),
+ ValueKind::String(s) => visitor.visit_string(s),
+ ValueKind::Array(values) => unimplemented!(),
+ ValueKind::Table(map) => visitor.visit_map(MapVisitor::new(map)),
_ => { unimplemented!(); }
}
}
- #[inline]
- fn deserialize_bool<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
- visitor.visit_bool(self.into_bool()?)
- }
-
- #[inline]
- fn deserialize_u8<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_u16<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_u32<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_u64<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_i8<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_i16<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_i32<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_i64<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
- visitor.visit_i64(self.into_int()?)
- }
-
- #[inline]
- fn deserialize_f32<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_f64<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
- visitor.visit_f64(self.into_float()?)
- }
-
- #[inline]
- fn deserialize_char<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_str<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_string<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_bytes<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_byte_buf<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_option<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_unit<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_unit_struct<V: de::Visitor>(self,
- name: &'static str,
- visitor: V)
- -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_newtype_struct<V: de::Visitor>(self,
- name: &'static str,
- visitor: V)
- -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_seq<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_seq_fixed_size<V: de::Visitor>(self,
- len: usize,
- visitor: V)
- -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_tuple<V: de::Visitor>(self, len: usize, visitor: V) -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_tuple_struct<V: de::Visitor>(self,
- name: &'static str,
- len: usize,
- visitor: V)
- -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_enum<V: de::Visitor>(self,
- name: &'static str,
- variants: &'static [&'static str],
- visitor: V)
- -> Result<V::Value> {
- unimplemented!();
- }
-
- #[inline]
- fn deserialize_ignored_any<V: de::Visitor>(self, visitor: V) -> Result<V::Value> {
- unimplemented!();
- }
-
forward_to_deserialize! {
- map
- struct
- struct_field
+ bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq
+ seq_fixed_size bytes byte_buf map struct unit enum newtype_struct
+ struct_field ignored_any unit_struct tuple_struct tuple option
}
}
struct StrDeserializer<'a>(&'a str);
+impl<'a> StrDeserializer<'a> {
+ fn new(key: &'a str) -> Self {
+ StrDeserializer(key)
+ }
+}
+
impl<'a> de::Deserializer for StrDeserializer<'a> {
type Error = ConfigError;
@@ -189,35 +49,9 @@ impl<'a> de::Deserializer for StrDeserializer<'a> {
}
forward_to_deserialize! {
- bool
- u8
- u16
- u32
- u64
- i8
- i16
- i32
- i64
- f32
- f64
- char
- str
- string
- bytes
- byte_buf
- option
- unit
- unit_struct
- newtype_struct
- seq
- seq_fixed_size
- tuple
- tuple_struct
- map
- struct
- struct_field
- enum
- ignored_any
+ bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq
+ seq_fixed_size bytes byte_buf map struct unit enum newtype_struct
+ struct_field ignored_any unit_struct tuple_struct tuple option
}
}
@@ -227,7 +61,7 @@ struct MapVisitor {
}
impl MapVisitor {
- fn new(mut table: HashMap<String, Value>) -> MapVisitor {
+ fn new(mut table: HashMap<String, Value>) -> Self {
MapVisitor { elements: table.drain().collect(), index: 0 }
}
}
@@ -242,8 +76,8 @@ impl de::MapVisitor for MapVisitor {
return Ok(None);
}
- let ref key_s = self.elements[0].0;
- let key_de = StrDeserializer(&key_s);
+ let key_s = &self.elements[0].0;
+ let key_de = StrDeserializer(key_s);
let key = de::DeserializeSeed::deserialize(seed, key_de)?;
Ok(Some(key))