Implement deserialize_enum for U32Deserializer
This commit is contained in:
parent
dc9445f873
commit
6d9397d573
@ -183,13 +183,72 @@ primitive_deserializer!(i64, I64Deserializer, visit_i64);
|
|||||||
primitive_deserializer!(isize, IsizeDeserializer, visit_i64 as i64);
|
primitive_deserializer!(isize, IsizeDeserializer, visit_i64 as i64);
|
||||||
primitive_deserializer!(u8, U8Deserializer, visit_u8);
|
primitive_deserializer!(u8, U8Deserializer, visit_u8);
|
||||||
primitive_deserializer!(u16, U16Deserializer, visit_u16);
|
primitive_deserializer!(u16, U16Deserializer, visit_u16);
|
||||||
primitive_deserializer!(u32, U32Deserializer, visit_u32);
|
|
||||||
primitive_deserializer!(u64, U64Deserializer, visit_u64);
|
primitive_deserializer!(u64, U64Deserializer, visit_u64);
|
||||||
primitive_deserializer!(usize, UsizeDeserializer, visit_u64 as u64);
|
primitive_deserializer!(usize, UsizeDeserializer, visit_u64 as u64);
|
||||||
primitive_deserializer!(f32, F32Deserializer, visit_f32);
|
primitive_deserializer!(f32, F32Deserializer, visit_f32);
|
||||||
primitive_deserializer!(f64, F64Deserializer, visit_f64);
|
primitive_deserializer!(f64, F64Deserializer, visit_f64);
|
||||||
primitive_deserializer!(char, CharDeserializer, visit_char);
|
primitive_deserializer!(char, CharDeserializer, visit_char);
|
||||||
|
|
||||||
|
/// A helper deserializer that deserializes a number.
|
||||||
|
pub struct U32Deserializer<E> {
|
||||||
|
value: u32,
|
||||||
|
marker: PhantomData<E>
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<E> ValueDeserializer<E> for u32
|
||||||
|
where E: de::Error,
|
||||||
|
{
|
||||||
|
type Deserializer = U32Deserializer<E>;
|
||||||
|
|
||||||
|
fn into_deserializer(self) -> U32Deserializer<E> {
|
||||||
|
U32Deserializer {
|
||||||
|
value: self,
|
||||||
|
marker: PhantomData,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<E> de::Deserializer for U32Deserializer<E>
|
||||||
|
where E: de::Error,
|
||||||
|
{
|
||||||
|
type Error = E;
|
||||||
|
|
||||||
|
forward_to_deserialize! {
|
||||||
|
bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option
|
||||||
|
seq seq_fixed_size bytes map unit_struct newtype_struct tuple_struct
|
||||||
|
struct struct_field tuple ignored_any byte_buf
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where V: de::Visitor,
|
||||||
|
{
|
||||||
|
visitor.visit_u32(self.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_enum<V>(self,
|
||||||
|
_name: &str,
|
||||||
|
_variants: &'static [&'static str],
|
||||||
|
visitor: V)
|
||||||
|
-> Result<V::Value, Self::Error>
|
||||||
|
where V: de::Visitor
|
||||||
|
{
|
||||||
|
visitor.visit_enum(self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<E> de::EnumVisitor for U32Deserializer<E>
|
||||||
|
where E: de::Error
|
||||||
|
{
|
||||||
|
type Error = E;
|
||||||
|
type Variant = private::UnitOnly<E>;
|
||||||
|
|
||||||
|
fn visit_variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
|
||||||
|
where T: de::DeserializeSeed
|
||||||
|
{
|
||||||
|
seed.deserialize(self).map(private::unit_only)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
/// A helper deserializer that deserializes a `&str`.
|
/// A helper deserializer that deserializes a `&str`.
|
||||||
|
19
test_suite/tests/test_value.rs
Normal file
19
test_suite/tests/test_value.rs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#[macro_use]
|
||||||
|
extern crate serde_derive;
|
||||||
|
|
||||||
|
extern crate serde;
|
||||||
|
use serde::Deserialize;
|
||||||
|
use serde::de::value::{self, ValueDeserializer};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_u32_to_enum() {
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
enum E {
|
||||||
|
A,
|
||||||
|
B,
|
||||||
|
}
|
||||||
|
|
||||||
|
let deserializer = ValueDeserializer::<value::Error>::into_deserializer(1u32);
|
||||||
|
let e: E = E::deserialize(deserializer).unwrap();
|
||||||
|
assert_eq!(E::B, e);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user