aboutsummaryrefslogtreecommitdiff
path: root/src/decoder
diff options
context:
space:
mode:
authorBen Navetta <ben.navetta@gmail.com>2015-08-06 23:30:08 -0400
committerBen Navetta <ben.navetta@gmail.com>2015-08-06 23:30:08 -0400
commit00337d088e16f000a1e15c8b3d64e962026ea34b (patch)
tree1ea37efbda8063f329e830d0c430dff0085c6a8d /src/decoder
parenta65e91bf57b483c33ca145e20be77885735ee600 (diff)
downloadmilf-rs-00337d088e16f000a1e15c8b3d64e962026ea34b.tar.gz
milf-rs-00337d088e16f000a1e15c8b3d64e962026ea34b.zip
implement serde::Deserialize for Value
Diffstat (limited to 'src/decoder')
-rw-r--r--src/decoder/serde.rs41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/decoder/serde.rs b/src/decoder/serde.rs
index 5db9786..aeafd6a 100644
--- a/src/decoder/serde.rs
+++ b/src/decoder/serde.rs
@@ -280,3 +280,44 @@ impl de::Deserializer for UnitDeserializer {
visitor.visit_none()
}
}
+
+// Based on https://github.com/serde-rs/serde/blob/199ed417bd6afc2071d17759b8c7e0ab8d0ba4cc/serde_json/src/value.rs#L265
+impl de::Deserialize for Value {
+ fn deserialize<D>(deserializer: &mut D) -> Result<Value, D::Error> {
+ struct ValueVisitor;
+
+ impl de::Visitor for ValueVisitor {
+ type Value = Value;
+
+ fn visit_bool<E>(&mut self, value: bool) -> Result<Value, E> {
+ Ok(Value::Boolean(value))
+ }
+
+ fn visit_i64<E>(&mut self, value: i64) -> Result<Value, E> {
+ Ok(Value::Integer(value))
+ }
+
+ fn visit_f64<E>(&mut self, value: f64) -> Result<Value, E> {
+ Ok(Value::Float(value))
+ }
+
+ fn visit_str<E>(&mut self, value: &str) -> Result<Value, E> {
+ Ok(Value::String(value.into()))
+ }
+
+ fn visit_string<E>(&mut self, value: String) -> Result<Value, E> {
+ Ok(Value::String(value))
+ }
+
+ fn visit_seq<V>(&mut self, visitor: V) -> Result<Value, V::Error> where V: de::SeqVisitor {
+ let values = try!(de::impls::VecVisitor::new().visit_seq(visitor));
+ Ok(Value::Array(values))
+ }
+
+ fn visit_map<V>(&mut self, visitor: V) -> Result<Value, V::Error> where V: de::MapVisitor {
+ let values = try!(de::impls::BTreeMapVisitor::new().visit_map(visitor));
+ Ok(Value::Table(values))
+ }
+ }
+ }
+}