exiftool/parse_fn/
date.rs

1use chrono::NaiveDate;
2use serde::{self, Deserialize, Deserializer};
3use serde_json::Value;
4
5pub fn date<'de, D>(deserializer: D) -> Result<Option<NaiveDate>, D::Error>
6where
7    D: Deserializer<'de>,
8{
9    // Deserialize into a generic JSON value
10    let value: Option<Value> = Option::deserialize(deserializer)?;
11
12    if let Some(value) = value {
13        match value {
14            Value::String(s) => {
15                // Try parsing the string as a NaiveDate
16                NaiveDate::parse_from_str(&s, "%Y:%m:%d")
17                    .map(Some)
18                    .map_err(|_| serde::de::Error::custom(format!("invalid date format: {s}")))
19            }
20            Value::Number(_) => Ok(None), // Gracefully skip numbers
21            Value::Null => Ok(None),
22            other => Err(serde::de::Error::custom(format!(
23                "unexpected type for date: {other:?}"
24            ))),
25        }
26    } else {
27        Ok(None)
28    }
29}