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
use std::fmt; use std::result; use serde::Deserialize; use serde::Deserializer; use serde::de::{self, Visitor}; use serde::de::SeqAccess; use std::marker::PhantomData; #[derive(Debug, Serialize, Deserialize)] pub struct StringOrBytes(#[serde(deserialize_with="string_or_bytes")] pub Vec<u8>); pub fn string_or_bytes<'de, D>(deserializer: D) -> result::Result<Vec<u8>, D::Error> where D: Deserializer<'de> { struct StringOrBytes(PhantomData<fn() -> Vec<u8>>); impl<'de> Visitor<'de> for StringOrBytes { type Value = Vec<u8>; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("string or sequence") } fn visit_str<E>(self, value: &str) -> result::Result<Vec<u8>, E> where E: de::Error, { Ok(value.as_bytes().to_vec()) } fn visit_seq<V>(self, mut visitor: V) -> result::Result<Vec<u8>, V::Error> where V: SeqAccess<'de>, { let mut vec = Vec::new(); while let Some(element) = visitor.next_element()? { vec.push(element) } Ok(vec) } } deserializer.deserialize_any(StringOrBytes(PhantomData)) } pub fn opt_string_or_bytes<'de, D>(deserializer: D) -> result::Result<Option<Vec<u8>>, D::Error> where D: Deserializer<'de> { Option::<StringOrBytes>::deserialize(deserializer) .map(|opt_wrapped: Option<StringOrBytes>| { opt_wrapped.map(|wrapped: StringOrBytes| wrapped.0) }) }