/// Implement serde serialization based on the /// fmt::Display and std::FromStr traits. macro_rules! serde_string_impl { ($name:ident, $expecting:expr) => { #[cfg(feature = "serde")] impl<'de> $crate::serde::Deserialize<'de> for $name { fn deserialize(deserializer: D) -> Result<$name, D::Error> where D: $crate::serde::de::Deserializer<'de>, { use std::fmt::{self, Formatter}; use std::str::FromStr; struct Visitor; impl<'de> $crate::serde::de::Visitor<'de> for Visitor { type Value = $name; fn expecting(&self, formatter: &mut Formatter) -> fmt::Result { formatter.write_str($expecting) } fn visit_str(self, v: &str) -> Result where E: $crate::serde::de::Error, { $name::from_str(v).map_err(E::custom) } fn visit_borrowed_str(self, v: &'de str) -> Result where E: $crate::serde::de::Error, { self.visit_str(v) } fn visit_string(self, v: String) -> Result where E: $crate::serde::de::Error, { self.visit_str(&v) } } deserializer.deserialize_str(Visitor) } } #[cfg(feature = "serde")] impl<'de> $crate::serde::Serialize for $name { fn serialize(&self, serializer: S) -> Result where S: $crate::serde::Serializer, { serializer.collect_str(&self) } } }; }