lightspark/types/
custom_date_formats.rs

1// Copyright ©, 2023-present, Lightspark Group, Inc. - All Rights Reserved
2
3pub mod custom_date_format {
4    use chrono::{DateTime, Utc};
5    use serde::{self, Deserialize, Deserializer, Serializer};
6
7    const FORMAT: &str = "%Y-%m-%dT%H:%M:%S%.f%z";
8
9    pub fn serialize<S>(date: &DateTime<Utc>, serializer: S) -> Result<S::Ok, S::Error>
10    where
11        S: Serializer,
12    {
13        let s = date.format(FORMAT).to_string();
14        serializer.serialize_str(&s)
15    }
16
17    pub fn deserialize<'de, D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>
18    where
19        D: Deserializer<'de>,
20    {
21        let s = String::deserialize(deserializer)?;
22        DateTime::parse_from_str(&s, FORMAT)
23            .map_err(|e| serde::de::Error::custom(format!("invalid date format: {}", e)))
24            .map(|dt| dt.with_timezone(&Utc))
25    }
26}
27
28pub mod custom_date_format_option {
29    use chrono::{DateTime, Utc};
30    use serde::{self, Deserialize, Deserializer, Serializer};
31
32    const FORMAT: &str = "%Y-%m-%dT%H:%M:%S%.f%z";
33
34    pub fn serialize<S>(date: &Option<DateTime<Utc>>, serializer: S) -> Result<S::Ok, S::Error>
35    where
36        S: Serializer,
37    {
38        match date {
39            Some(date) => {
40                let s = date.format(FORMAT).to_string();
41                serializer.serialize_str(&s)
42            }
43            None => serializer.serialize_none(),
44        }
45    }
46
47    pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<DateTime<Utc>>, D::Error>
48    where
49        D: Deserializer<'de>,
50    {
51        let s = Option::<String>::deserialize(deserializer)?;
52        match s {
53            Some(s) => DateTime::parse_from_str(&s, FORMAT)
54                .map_err(|e| serde::de::Error::custom(format!("invalid date format: {}", e)))
55                .map(|dt| dt.with_timezone(&Utc))
56                .map(Some),
57            None => Ok(None),
58        }
59    }
60}
61
62pub mod custom_date_only_format {
63    use chrono::NaiveDate;
64    use serde::{self, Deserialize, Deserializer, Serializer};
65
66    const FORMAT: &str = "%Y-%m-%d";
67
68    pub fn serialize<S>(date: &NaiveDate, serializer: S) -> Result<S::Ok, S::Error>
69    where
70        S: Serializer,
71    {
72        let s = date.format(FORMAT).to_string();
73        serializer.serialize_str(&s)
74    }
75
76    pub fn deserialize<'de, D>(deserializer: D) -> Result<NaiveDate, D::Error>
77    where
78        D: Deserializer<'de>,
79    {
80        let s = String::deserialize(deserializer)?;
81        NaiveDate::parse_from_str(&s, FORMAT)
82            .map_err(|e| serde::de::Error::custom(format!("invalid date format: {}", e)))
83    }
84}
85
86pub mod custom_date_only_format_option {
87    use chrono::NaiveDate;
88    use serde::{self, Deserialize, Deserializer, Serializer};
89
90    const FORMAT: &str = "%Y-%m-%d";
91
92    pub fn serialize<S>(date: &Option<NaiveDate>, serializer: S) -> Result<S::Ok, S::Error>
93    where
94        S: Serializer,
95    {
96        match date {
97            Some(date) => {
98                let s = date.format(FORMAT).to_string();
99                serializer.serialize_str(&s)
100            }
101            None => serializer.serialize_none(),
102        }
103    }
104
105    pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<NaiveDate>, D::Error>
106    where
107        D: Deserializer<'de>,
108    {
109        let s = Option::<String>::deserialize(deserializer)?;
110        match s {
111            Some(s) => NaiveDate::parse_from_str(&s, FORMAT)
112                .map_err(|e| serde::de::Error::custom(format!("invalid date format: {}", e)))
113                .map(Some),
114            None => Ok(None),
115        }
116    }
117}