exiftool/parse_fn/
date.rs1use chrono::NaiveDate;
2use serde::{self, Deserialize, Deserializer};
3use serde_json::Value;
4
5pub fn date<'de, D>(deserializer: D) -> Result<Option<NaiveDate>, D::Error>
11where
12 D: Deserializer<'de>,
13{
14 let value: Option<Value> = Option::deserialize(deserializer)?;
16
17 value.map_or_else(
18 || Ok(None),
19 |value| match value {
20 Value::String(s) => {
21 NaiveDate::parse_from_str(&s, "%Y:%m:%d")
23 .map(Some)
24 .map_err(|_| serde::de::Error::custom(format!("invalid date format: {s}")))
25 }
26 Value::Number(_) | Value::Null => Ok(None), other => Err(serde::de::Error::custom(format!(
28 "unexpected type for date: {other:?}"
29 ))),
30 },
31 )
32}