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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
use std::fmt; use serde::{Serialize, Serializer, Deserializer}; use serde::de::{Visitor, Unexpected}; use keys::Address; pub fn serialize<S>(address: &Address, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer { address.to_string().serialize(serializer) } pub fn deserialize<'a, D>(deserializer: D) -> Result<Address, D::Error> where D: Deserializer<'a> { deserializer.deserialize_any(AddressVisitor) } #[derive(Default)] pub struct AddressVisitor; impl<'b> Visitor<'b> for AddressVisitor { type Value = Address; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("an address") } fn visit_str<E>(self, value: &str) -> Result<Self::Value, E> where E: ::serde::de::Error { value.parse().map_err(|_| E::invalid_value(Unexpected::Str(value), &self)) } } pub mod vec { use serde::{Serialize, Serializer, Deserializer, Deserialize}; use serde::de::Visitor; use keys::Address; use super::AddressVisitor; pub fn serialize<S>(addresses: &Vec<Address>, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer { addresses.iter().map(|address| address.to_string()).collect::<Vec<_>>().serialize(serializer) } pub fn deserialize<'a, D>(deserializer: D) -> Result<Vec<Address>, D::Error> where D: Deserializer<'a> { <Vec<&'a str> as Deserialize>::deserialize(deserializer)? .into_iter() .map(|value| AddressVisitor::default().visit_str(value)) .collect() } } #[cfg(test)] mod tests { use serde_json; use keys::Address; use v1::types; #[derive(Debug, PartialEq, Serialize, Deserialize)] struct TestStruct { #[serde(with = "types::address")] address: Address, } impl TestStruct { fn new(address: Address) -> Self { TestStruct { address: address, } } } #[test] fn address_serialize() { let test = TestStruct::new("1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa".into()); assert_eq!(serde_json::to_string(&test).unwrap(), r#"{"address":"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"}"#); } #[test] fn address_deserialize() { let test = TestStruct::new("1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa".into()); assert_eq!(serde_json::from_str::<TestStruct>(r#"{"address":"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"}"#).unwrap(), test); } }