use std::{ ops::{Deref, DerefMut}, str::FromStr, }; #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] pub(crate) struct Serde { inner: T, } impl Serde { pub(crate) fn new(inner: T) -> Self { Serde { inner } } pub(crate) fn into_inner(this: Self) -> T { this.inner } } impl AsRef for Serde { fn as_ref(&self) -> &T { &self.inner } } impl AsMut for Serde { fn as_mut(&mut self) -> &mut T { &mut self.inner } } impl Deref for Serde { type Target = T; fn deref(&self) -> &Self::Target { &self.inner } } impl DerefMut for Serde { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.inner } } impl Default for Serde where T: Default, { fn default() -> Self { Serde { inner: T::default(), } } } impl FromStr for Serde where T: FromStr, { type Err = T::Err; fn from_str(s: &str) -> Result { Ok(Serde { inner: T::from_str(s)?, }) } } impl serde::Serialize for Serde where T: std::fmt::Display, { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, { let s = self.inner.to_string(); serde::Serialize::serialize(s.as_str(), serializer) } } impl<'de, T> serde::Deserialize<'de> for Serde where T: std::str::FromStr, ::Err: std::fmt::Display, { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, { let s: String = serde::Deserialize::deserialize(deserializer)?; let inner = s .parse::() .map_err(|e| serde::de::Error::custom(e.to_string()))?; Ok(Serde { inner }) } }