use serde::de::{Unexpected, Visitor}; use serde::{Deserializer, Serialize, Serializer}; use std::fmt; use zebra_keys::Address; pub fn serialize(address: &Address, serializer: S) -> Result where S: Serializer, { address.to_string().serialize(serializer) } pub fn deserialize<'a, D>(deserializer: D) -> Result 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(self, value: &str) -> Result where E: ::serde::de::Error, { value .parse() .map_err(|_| E::invalid_value(Unexpected::Str(value), &self)) } } pub mod vec { use super::AddressVisitor; use serde::de::Visitor; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use zebra_keys::Address; pub fn serialize(addresses: &Vec
, serializer: S) -> Result where S: Serializer, { addresses .iter() .map(|address| address.to_string()) .collect::>() .serialize(serializer) } pub fn deserialize<'a, D>(deserializer: D) -> Result, D::Error> where D: Deserializer<'a>, { as Deserialize>::deserialize(deserializer)? .into_iter() .map(|value| AddressVisitor::default().visit_str(value)) .collect() } } #[cfg(test)] mod tests { use serde_json; use v1::types; use zebra_keys::Address; #[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("t2UNzUUx8mWBCRYPRezvA363EYXyEpHokyi".into()); assert_eq!( serde_json::to_string(&test).unwrap(), r#"{"address":"t2UNzUUx8mWBCRYPRezvA363EYXyEpHokyi"}"# ); } #[test] fn address_deserialize() { let test = TestStruct::new("t2UNzUUx8mWBCRYPRezvA363EYXyEpHokyi".into()); assert_eq!( serde_json::from_str::( r#"{"address":"t2UNzUUx8mWBCRYPRezvA363EYXyEpHokyi"}"# ) .unwrap(), test ); } }