use serde::{Deserialize, Deserializer};
pub(crate) fn optional_string_from_number_or_string<'de, D>(
deserializer: D,
) -> Result<Option<String>, D::Error>
where
D: Deserializer<'de>,
{
match serde_json::Value::deserialize(deserializer)? {
serde_json::Value::Null => Ok(None),
serde_json::Value::String(value) => Ok(Some(value)),
serde_json::Value::Number(value) => Ok(Some(value.to_string())),
other => Err(serde::de::Error::custom(format!(
"expected string, number, or null; got {other}"
))),
}
}
pub(crate) fn optional_json_string<'de, D>(deserializer: D) -> Result<Option<String>, D::Error>
where
D: Deserializer<'de>,
{
match serde_json::Value::deserialize(deserializer)? {
serde_json::Value::Null => Ok(None),
serde_json::Value::String(value) => Ok(Some(value)),
other => serde_json::to_string(&other)
.map(Some)
.map_err(serde::de::Error::custom),
}
}