rfc_manager/serde_format/
rfc_3339_with_option.rs

1use chrono::{DateTime, TimeZone, Utc};
2use serde::{self, Deserialize, Deserializer};
3
4fn fmt_date<'de, D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>
5where
6    D: Deserializer<'de>,
7{
8    let s = String::deserialize(deserializer)?;
9    // ref. https://docs.rs/chrono/0.4.19/chrono/struct.DateTime.html#method.parse_from_rfc3339
10    match DateTime::parse_from_rfc3339(&s).map_err(serde::de::Error::custom) {
11        Ok(dt) => Ok(Utc.from_utc_datetime(&dt.naive_utc())),
12        Err(e) => Err(e),
13    }
14}
15
16pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<DateTime<Utc>>, D::Error>
17where
18    D: Deserializer<'de>,
19{
20    #[derive(Deserialize)]
21    struct Wrapper(#[serde(deserialize_with = "fmt_date")] DateTime<Utc>);
22    let v = Option::deserialize(deserializer)?;
23    Ok(v.map(|Wrapper(a)| a))
24}