1pub mod date_time_format {
2 use chrono::{DateTime, NaiveDateTime, Utc};
3 use serde::{self, Deserialize, Deserializer};
4 const FORMAT: &str = "%Y-%m-%dT%H:%M:%S";
5 pub fn deserialize<'de, D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>
13 where
14 D: Deserializer<'de>,
15 {
16 let s: String = String::deserialize(deserializer)?;
17 match NaiveDateTime::parse_from_str(&s, FORMAT) {
18 Ok(t) => Ok(t.and_utc()),
19 Err(_) => match serde_json::from_str::<DateTime<Utc>>(&format!("\"{}\"", s)) {
20 Ok(t) => Ok(t),
21 Err(e) => Err(serde::de::Error::custom(format!(
22 "deserializing {} as DateTime<Utc> failed: {}",
23 s, e
24 ))),
25 },
26 }
27 }
28}
29
30pub mod nullable_date_time_format {
31 use chrono::{DateTime, NaiveDateTime, Utc};
32 use serde::{self, Deserialize, Deserializer};
33 const FORMAT: &str = "%Y-%m-%dT%H:%M:%S";
34 pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<DateTime<Utc>>, D::Error>
42 where
43 D: Deserializer<'de>,
44 {
45 let s: Option<String> = Option::deserialize(deserializer)?;
46 if let Some(s) = s {
47 match NaiveDateTime::parse_from_str(&s, FORMAT) {
49 Ok(t) => Ok(Some(t.and_utc())),
50 Err(_) => match serde_json::from_str::<DateTime<Utc>>(&format!("\"{}\"", s)) {
51 Ok(t) => Ok(Some(t)),
52 Err(e) => Err(serde::de::Error::custom(format!(
53 "deserializing {} as DateTime<Utc> failed: {}",
54 s, e
55 ))),
56 },
57 }
58 } else {
59 Ok(None)
60 }
61 }
62}