1use serde::{Deserialize, Serialize};
3
4pub mod datetime {
5 use chrono::{DateTime, TimeZone, Utc};
6 use serde::{Deserialize, Deserializer, Serializer};
7
8 const FORMAT: &str = "%Y/%m/%d,%H:%M:%S";
9
10 pub fn serialize<S>(date: &DateTime<Utc>, serializer: S) -> Result<S::Ok, S::Error>
11 where
12 S: Serializer,
13 {
14 let s = format!("{}", date.format(FORMAT));
15 serializer.serialize_str(&s)
16 }
17
18 pub fn deserialize<'de, D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>
19 where
20 D: Deserializer<'de>,
21 {
22 Utc.datetime_from_str(&String::deserialize(deserializer)?, FORMAT)
23 .map_err(serde::de::Error::custom)
24 }
25}
26
27pub mod date {
28 use chrono::NaiveDate;
29 use serde::{Deserialize, Deserializer, Serializer};
30
31 const FORMAT: &str = "%d %B %Y";
32
33 pub fn serialize<S>(date: &NaiveDate, serializer: S) -> Result<S::Ok, S::Error>
34 where
35 S: Serializer,
36 {
37 let s = format!("{}", date.format(FORMAT));
38 serializer.serialize_str(&s)
39 }
40
41 pub fn deserialize<'de, D>(deserializer: D) -> Result<NaiveDate, D::Error>
42 where
43 D: Deserializer<'de>,
44 {
45 NaiveDate::parse_from_str(&String::deserialize(deserializer)?, FORMAT)
46 .map_err(serde::de::Error::custom)
47 }
48}
49
50pub mod date_m_dd_yyyy {
51 use chrono::NaiveDate;
52 use serde::{Deserialize, Deserializer, Serializer};
53
54 const FORMAT: &str = "%B %d, %Y";
55
56 pub fn serialize<S>(date: &NaiveDate, serializer: S) -> Result<S::Ok, S::Error>
57 where
58 S: Serializer,
59 {
60 let s = format!("{}", date.format(FORMAT));
61 serializer.serialize_str(&s)
62 }
63
64 pub fn deserialize<'de, D>(deserializer: D) -> Result<NaiveDate, D::Error>
65 where
66 D: Deserializer<'de>,
67 {
68 NaiveDate::parse_from_str(&String::deserialize(deserializer)?, FORMAT)
69 .map_err(serde::de::Error::custom)
70 }
71}
72
73#[derive(Debug, Deserialize, Eq, PartialEq, Serialize)]
74pub struct KeyedValue<T> {
75 pub key: T,
76}
77
78pub mod keyed_value {
79 use crate::format::KeyedValue;
80 use serde::{Deserialize, Deserializer, Serialize, Serializer};
81
82 pub fn serialize<S, T>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
83 where
84 S: Serializer,
85 T: Serialize,
86 {
87 KeyedValue { key: value }.serialize(serializer)
88 }
89
90 pub fn deserialize<'de, D, T>(deserializer: D) -> Result<T, D::Error>
91 where
92 D: Deserializer<'de>,
93 T: Deserialize<'de>,
94 {
95 Ok(KeyedValue::deserialize(deserializer)?.key)
96 }
97}
98
99pub mod keyed_list {
100 use crate::format::KeyedValue;
101 use serde::{Deserialize, Deserializer, Serialize, Serializer};
102
103 pub fn serialize<S, T>(values: &[T], serializer: S) -> Result<S::Ok, S::Error>
104 where
105 S: Serializer,
106 T: Serialize,
107 {
108 values
109 .iter()
110 .map(|x| KeyedValue { key: x })
111 .collect::<Vec<KeyedValue<&T>>>()
112 .serialize(serializer)
113 }
114
115 pub fn deserialize<'de, D, T>(deserializer: D) -> Result<Vec<T>, D::Error>
116 where
117 D: Deserializer<'de>,
118 T: Deserialize<'de>,
119 {
120 let result: Vec<KeyedValue<T>> = Deserialize::deserialize(deserializer)?;
121 let x1: Vec<T> = result.into_iter().map(|x: KeyedValue<T>| x.key).collect();
122 Ok(x1)
123 }
124}
125
126pub mod value {
128 use serde::{Deserialize, Deserializer, Serialize, Serializer};
129
130 #[derive(Deserialize, Serialize)]
131 struct TypedValue<T> {
132 value: T,
133 }
134
135 pub fn serialize<S, T>(value: T, serializer: S) -> Result<S::Ok, S::Error>
136 where
137 S: Serializer,
138 T: Serialize,
139 {
140 TypedValue { value }.serialize(serializer)
141 }
142
143 pub fn deserialize<'de, D, T>(deserializer: D) -> Result<Option<T>, D::Error>
144 where
145 D: Deserializer<'de>,
146 T: Deserialize<'de>,
147 {
148 Ok(Some(TypedValue::deserialize(deserializer)?.value))
149 }
150}