use std::fmt; use std::marker::PhantomData; use std::str::FromStr; use serde::de::{Deserializer, Error as SerdeError, Visitor}; use serde::ser::Serializer; /// From https://docs.rs/serde_with/1.14.0/src/serde_with/rust.rs.html#90-118 pub fn deserialize_from_str<'de, D, T>(deserializer: D) -> Result where D: Deserializer<'de>, T: FromStr, T::Err: fmt::Display, { struct Helper(PhantomData); impl<'de, S> Visitor<'de> for Helper where S: FromStr, ::Err: fmt::Display, { type Value = S; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { write!(formatter, "a string") } fn visit_str(self, value: &str) -> Result where E: SerdeError, { value.parse::().map_err(SerdeError::custom) } } deserializer.deserialize_str(Helper(PhantomData)) } /// From https://docs.rs/serde_with/1.14.0/src/serde_with/rust.rs.html#121-127 pub fn serialize_to_str(value: &T, serializer: S) -> Result where T: fmt::Display, S: Serializer, { serializer.collect_str(&value) }