1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
#![recursion_limit="200"] extern crate serde; use serde::de::{ Deserialize, Deserializer, Error, Visitor }; use serde::ser::{ Serialize, Serializer }; use std::fmt::{ Formatter, Result as FmtResult }; #[derive(Clone, Debug, Eq, PartialEq)] pub enum NumberOrString { Number(u64), String(String), } impl <'a> Deserialize<'a> for NumberOrString { fn deserialize<D>(deserializer: D) -> Result<NumberOrString, D::Error> where D: Deserializer<'a> { struct NumberOrStringVisitor; impl <'b> Visitor<'b> for NumberOrStringVisitor { type Value = NumberOrString; fn expecting(&self, formatter: &mut Formatter) -> FmtResult { formatter.write_str("A u64 or a string.") } fn visit_u32<E>(self, value: u32) -> Result<NumberOrString, E> where E: Error { Ok(NumberOrString::Number(value as u64)) } fn visit_u64<E>(self, value: u64) -> Result<NumberOrString, E> where E: Error { Ok(NumberOrString::Number(value)) } fn visit_str<E>(self, value: &str) -> Result<NumberOrString, E> where E: Error { Ok(NumberOrString::String(value.to_string())) } } deserializer.deserialize_any(NumberOrStringVisitor) } } impl Serialize for NumberOrString { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer { match self { &NumberOrString::Number(value) => serializer.serialize_u64(value), &NumberOrString::String(ref value) => serializer.serialize_str(value), } } }