aboutsummaryrefslogtreecommitdiff
path: root/src/value.rs
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2017-04-28 15:01:08 -0500
committerGitHub <noreply@github.com>2017-04-28 15:01:08 -0500
commit95b3545938f67ca98d313be5c9c8930ee2407a30 (patch)
tree4ec4a2484d45132da883a11b7a1a6700ba06480d /src/value.rs
parentd8b6c83da660db49949bb484c5e3eeea9642cd8e (diff)
parent082ee7090212e8a377b2145fe82712cc41431fee (diff)
downloadmilf-rs-95b3545938f67ca98d313be5c9c8930ee2407a30.tar.gz
milf-rs-95b3545938f67ca98d313be5c9c8930ee2407a30.zip
Merge pull request #165 from Keats/master
Allow to deserialize/serialize into enums
Diffstat (limited to 'src/value.rs')
-rw-r--r--src/value.rs21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/value.rs b/src/value.rs
index 7c2b3eb..dcc3567 100644
--- a/src/value.rs
+++ b/src/value.rs
@@ -8,6 +8,7 @@ use std::vec;
use serde::ser;
use serde::de;
+use serde::de::IntoDeserializer;
pub use datetime::{Datetime, DatetimeParseError};
use datetime::{DatetimeFromString, SERDE_STRUCT_FIELD_NAME};
@@ -505,6 +506,22 @@ impl<'de> de::Deserializer<'de> for Value {
}
}
+ #[inline]
+ fn deserialize_enum<V>(
+ self,
+ _name: &str,
+ _variants: &'static [&'static str],
+ visitor: V,
+ ) -> Result<V::Value, ::de::Error>
+ where
+ V: de::Visitor<'de>,
+ {
+ match self {
+ Value::String(variant) => visitor.visit_enum(variant.into_deserializer()),
+ _ => Err(de::Error::invalid_type(de::Unexpected::UnitVariant, &"string only")),
+ }
+ }
+
// `None` is interpreted as a missing field so be sure to implement `Some`
// as a present field.
fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, ::de::Error>
@@ -516,7 +533,7 @@ impl<'de> de::Deserializer<'de> for Value {
forward_to_deserialize_any! {
bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq
bytes byte_buf map unit_struct tuple_struct struct
- tuple ignored_any enum newtype_struct identifier
+ tuple ignored_any newtype_struct identifier
}
}
@@ -694,7 +711,7 @@ impl ser::Serializer for Serializer {
_variant_index: u32,
_variant: &'static str)
-> Result<Value, ::ser::Error> {
- Err(::ser::Error::UnsupportedType)
+ self.serialize_str(_variant)
}
fn serialize_newtype_struct<T: ?Sized>(self,