Skip to content

Instantly share code, notes, and snippets.

@afpro
Last active April 18, 2024 11:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save afpro/e1b6551e82642674099c42ce596df7ec to your computer and use it in GitHub Desktop.
Save afpro/e1b6551e82642674099c42ce596df7ec to your computer and use it in GitHub Desktop.
serde_as_text
pub mod as_text {
use std::{fmt::Display, str::FromStr};
use serde::{de::Error as DeError, Deserialize, Deserializer, Serializer};
#[derive(Deserialize)]
#[serde(untagged)]
enum OrText<'a, T> {
Data(T),
Text(&'a str),
}
pub fn serialize<T, S>(value: &T, ser: S) -> Result<S::Ok, S::Error>
where
T: Display,
S: Serializer,
{
let value = format!("{}", value);
ser.serialize_str(&value)
}
pub fn deserialize<'de, T, D>(de: D) -> Result<T, D::Error>
where
T: Deserialize<'de> + FromStr,
T::Err: Display,
D: Deserializer<'de>,
{
match <OrText<'de, T> as Deserialize<'de>>::deserialize(de)? {
OrText::Data(data) => Ok(data),
OrText::Text(text) => T::from_str(text)
.map_err(|err| DeError::custom(format!("parse text error {}", err))),
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment