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>
6where
7 D: Deserializer<'de>,
8{
9 let value: Option<Value> = Option::deserialize(deserializer)?;
11
12 if let Some(value) = value {
13 match value {
14 Value::String(s) => {
15 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), 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}