use serde::{Deserialize, Deserializer};
use std::fmt::Display;
use std::str::FromStr;
pub fn deserialize_maybe_quoted<'de, T, D>(deserializer: D) -> Result<T, D::Error>
where
T: FromStr + Deserialize<'de>,
T::Err: Display,
D: Deserializer<'de>,
{
#[derive(Deserialize)]
#[serde(untagged)]
enum MaybeQuoted<T> {
Native(T),
Quoted(String),
}
match MaybeQuoted::<T>::deserialize(deserializer)? {
MaybeQuoted::Native(val) => Ok(val),
MaybeQuoted::Quoted(s) => T::from_str(&s).map_err(serde::de::Error::custom),
}
}
pub fn deserialize_opt_maybe_quoted<'de, T, D>(deserializer: D) -> Result<Option<T>, D::Error>
where
T: FromStr + Deserialize<'de>,
T::Err: Display,
D: Deserializer<'de>,
{
#[derive(Deserialize)]
#[serde(untagged)]
enum MaybeQuoted<T> {
Native(T),
Quoted(String),
Null,
}
match MaybeQuoted::<T>::deserialize(deserializer)? {
MaybeQuoted::Native(val) => Ok(Some(val)),
MaybeQuoted::Quoted(s) => T::from_str(&s).map(Some).map_err(serde::de::Error::custom),
MaybeQuoted::Null => Ok(None),
}
}