use serde::de::{self, Visitor};
use serde::{Deserializer, Serializer};
use std::fmt::{self, Display};
use std::str::FromStr;
pub fn display_it<T, S>(data: &T, serializer: S) -> Result<S::Ok, S::Error>
where
T: Display,
S: Serializer,
{
serializer.collect_str(data)
}
pub fn parse_it<'de, T, D>(deserializer: D) -> Result<T, D::Error>
where
T: FromStr,
<T as FromStr>::Err: Display,
D: Deserializer<'de>,
{
struct DisplayVisitor<T>(std::marker::PhantomData<T>);
impl<'de, T> Visitor<'de> for DisplayVisitor<T>
where
T: FromStr,
<T as FromStr>::Err: Display,
{
type Value = T;
fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("a stringified integer")
}
fn visit_str<E: de::Error>(self, v: &str) -> Result<T, E> {
v.parse().map_err(de::Error::custom)
}
}
deserializer.deserialize_str(DisplayVisitor(std::marker::PhantomData))
}