use chrono::NaiveDate;
use serde::{self, Deserialize, Deserializer};
use serde_json::Value;
pub fn date<'de, D>(deserializer: D) -> Result<Option<NaiveDate>, D::Error>
where
D: Deserializer<'de>,
{
let value: Option<Value> = Option::deserialize(deserializer)?;
value.map_or_else(
|| Ok(None),
|value| match value {
Value::String(s) => {
NaiveDate::parse_from_str(&s, "%Y:%m:%d")
.map(Some)
.map_err(|_| serde::de::Error::custom(format!("invalid date format: {s}")))
}
Value::Number(_) | Value::Null => Ok(None), other => Err(serde::de::Error::custom(format!(
"unexpected type for date: {other:?}"
))),
},
)
}