remote_api/
utils.rs

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    // The signature of a deserialize_with function must follow the pattern:
6    //
7    //    fn deserialize<'de, D>(D) -> Result<T, D::Error>
8    //    where
9    //        D: Deserializer<'de>
10    //
11    // although it may also be generic over the output types T.
12    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    // The signature of a deserialize_with function must follow the pattern:
35    //
36    //    fn deserialize<'de, D>(D) -> Result<T, D::Error>
37    //    where
38    //        D: Deserializer<'de>
39    //
40    // although it may also be generic over the output types T.
41    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            // This is standard.
48            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}