lightspark/types/
custom_date_formats.rs1pub 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}