1use std::{fmt::Debug, str::FromStr};
2
3use serde::Deserialize;
4use serde::{Deserializer, Serialize, Serializer};
5
6pub fn serialize<T: ToString + Serialize, S>(val: T, serializer: S) -> Result<S::Ok, S::Error>
7where
8 S: Serializer,
9{
10 if serializer.is_human_readable() {
11 serializer.serialize_str(&val.to_string())
12 } else {
13 val.serialize(serializer)
14 }
15}
16
17pub fn deserialize<'de, T: FromStr + Deserialize<'de>, D>(deserializer: D) -> Result<T, D::Error>
18where
19 D: Deserializer<'de>,
20 <T as std::str::FromStr>::Err: Debug,
21{
22 if deserializer.is_human_readable() {
23 let s = String::deserialize(deserializer)?;
24 s.parse()
25 .map_err(|e| serde::de::Error::custom(format!("FromStr parsing error {:?}", e)))
26 } else {
27 T::deserialize(deserializer)
28 }
29 }