rfc_manager/serde_format/
rfc_3339_with_option.rs1use 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 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}