diff options
author | Alex Crichton <alex@alexcrichton.com> | 2017-04-28 15:01:08 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-28 15:01:08 -0500 |
commit | 95b3545938f67ca98d313be5c9c8930ee2407a30 (patch) | |
tree | 4ec4a2484d45132da883a11b7a1a6700ba06480d /src/value.rs | |
parent | d8b6c83da660db49949bb484c5e3eeea9642cd8e (diff) | |
parent | 082ee7090212e8a377b2145fe82712cc41431fee (diff) | |
download | milf-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.rs | 21 |
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, |