1pub fn is_datetime(name: &'static str) -> bool {
5 crate::datetime::is_datetime(name)
6}
7
8#[derive(Debug)]
10#[non_exhaustive]
11pub enum SerializerError {
12 InvalidFormat(crate::DatetimeParseError),
14 InvalidProtocol,
16}
17
18impl serde_core::ser::Error for SerializerError {
19 fn custom<T>(_msg: T) -> Self
20 where
21 T: core::fmt::Display,
22 {
23 Self::InvalidProtocol
24 }
25}
26
27impl core::fmt::Display for SerializerError {
28 fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
29 match self {
30 Self::InvalidFormat(e) => e.fmt(formatter),
31 Self::InvalidProtocol => "invalid serialization protocol".fmt(formatter),
32 }
33 }
34}
35
36impl core::error::Error for SerializerError {}
37
38#[derive(Default)]
40pub struct DatetimeSerializer {
41 value: Option<crate::Datetime>,
42}
43
44impl DatetimeSerializer {
45 pub fn new() -> Self {
47 Self { value: None }
48 }
49
50 pub fn serialize_field<T>(
52 &mut self,
53 key: &'static str,
54 value: &T,
55 ) -> Result<(), SerializerError>
56 where
57 T: serde_core::ser::Serialize + ?Sized,
58 {
59 if key == crate::datetime::FIELD {
60 self.value = Some(value.serialize(DatetimeFieldSerializer::default())?);
61 }
62
63 Ok(())
64 }
65
66 pub fn end(self) -> Result<crate::Datetime, SerializerError> {
68 self.value.ok_or(SerializerError::InvalidProtocol)
69 }
70}
71
72#[derive(Default)]
73struct DatetimeFieldSerializer {}
74
75impl serde_core::ser::Serializer for DatetimeFieldSerializer {
76 type Ok = crate::Datetime;
77 type Error = SerializerError;
78 type SerializeSeq = serde_core::ser::Impossible<Self::Ok, Self::Error>;
79 type SerializeTuple = serde_core::ser::Impossible<Self::Ok, Self::Error>;
80 type SerializeTupleStruct = serde_core::ser::Impossible<Self::Ok, Self::Error>;
81 type SerializeTupleVariant = serde_core::ser::Impossible<Self::Ok, Self::Error>;
82 type SerializeMap = serde_core::ser::Impossible<Self::Ok, Self::Error>;
83 type SerializeStruct = serde_core::ser::Impossible<Self::Ok, Self::Error>;
84 type SerializeStructVariant = serde_core::ser::Impossible<Self::Ok, Self::Error>;
85
86 fn serialize_bool(self, _value: bool) -> Result<Self::Ok, Self::Error> {
87 Err(SerializerError::InvalidProtocol)
88 }
89
90 fn serialize_i8(self, _value: i8) -> Result<Self::Ok, Self::Error> {
91 Err(SerializerError::InvalidProtocol)
92 }
93
94 fn serialize_i16(self, _value: i16) -> Result<Self::Ok, Self::Error> {
95 Err(SerializerError::InvalidProtocol)
96 }
97
98 fn serialize_i32(self, _value: i32) -> Result<Self::Ok, Self::Error> {
99 Err(SerializerError::InvalidProtocol)
100 }
101
102 fn serialize_i64(self, _value: i64) -> Result<Self::Ok, Self::Error> {
103 Err(SerializerError::InvalidProtocol)
104 }
105
106 fn serialize_u8(self, _value: u8) -> Result<Self::Ok, Self::Error> {
107 Err(SerializerError::InvalidProtocol)
108 }
109
110 fn serialize_u16(self, _value: u16) -> Result<Self::Ok, Self::Error> {
111 Err(SerializerError::InvalidProtocol)
112 }
113
114 fn serialize_u32(self, _value: u32) -> Result<Self::Ok, Self::Error> {
115 Err(SerializerError::InvalidProtocol)
116 }
117
118 fn serialize_u64(self, _value: u64) -> Result<Self::Ok, Self::Error> {
119 Err(SerializerError::InvalidProtocol)
120 }
121
122 fn serialize_f32(self, _value: f32) -> Result<Self::Ok, Self::Error> {
123 Err(SerializerError::InvalidProtocol)
124 }
125
126 fn serialize_f64(self, _value: f64) -> Result<Self::Ok, Self::Error> {
127 Err(SerializerError::InvalidProtocol)
128 }
129
130 fn serialize_char(self, _value: char) -> Result<Self::Ok, Self::Error> {
131 Err(SerializerError::InvalidProtocol)
132 }
133
134 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
135 v.parse::<crate::Datetime>()
136 .map_err(SerializerError::InvalidFormat)
137 }
138
139 fn serialize_bytes(self, _value: &[u8]) -> Result<Self::Ok, Self::Error> {
140 Err(SerializerError::InvalidProtocol)
141 }
142
143 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
144 Err(SerializerError::InvalidProtocol)
145 }
146
147 fn serialize_some<T>(self, _value: &T) -> Result<Self::Ok, Self::Error>
148 where
149 T: serde_core::ser::Serialize + ?Sized,
150 {
151 Err(SerializerError::InvalidProtocol)
152 }
153
154 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
155 Err(SerializerError::InvalidProtocol)
156 }
157
158 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
159 Err(SerializerError::InvalidProtocol)
160 }
161
162 fn serialize_unit_variant(
163 self,
164 _name: &'static str,
165 _variant_index: u32,
166 _variant: &'static str,
167 ) -> Result<Self::Ok, Self::Error> {
168 Err(SerializerError::InvalidProtocol)
169 }
170
171 fn serialize_newtype_struct<T>(
172 self,
173 _name: &'static str,
174 _value: &T,
175 ) -> Result<Self::Ok, Self::Error>
176 where
177 T: serde_core::ser::Serialize + ?Sized,
178 {
179 Err(SerializerError::InvalidProtocol)
180 }
181
182 fn serialize_newtype_variant<T>(
183 self,
184 _name: &'static str,
185 _variant_index: u32,
186 _variant: &'static str,
187 _value: &T,
188 ) -> Result<Self::Ok, Self::Error>
189 where
190 T: serde_core::ser::Serialize + ?Sized,
191 {
192 Err(SerializerError::InvalidProtocol)
193 }
194
195 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
196 Err(SerializerError::InvalidProtocol)
197 }
198
199 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
200 Err(SerializerError::InvalidProtocol)
201 }
202
203 fn serialize_tuple_struct(
204 self,
205 _name: &'static str,
206 _len: usize,
207 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
208 Err(SerializerError::InvalidProtocol)
209 }
210
211 fn serialize_tuple_variant(
212 self,
213 _name: &'static str,
214 _variant_index: u32,
215 _variant: &'static str,
216 _len: usize,
217 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
218 Err(SerializerError::InvalidProtocol)
219 }
220
221 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
222 Err(SerializerError::InvalidProtocol)
223 }
224
225 fn serialize_struct(
226 self,
227 _name: &'static str,
228 _len: usize,
229 ) -> Result<Self::SerializeStruct, Self::Error> {
230 Err(SerializerError::InvalidProtocol)
231 }
232
233 fn serialize_struct_variant(
234 self,
235 _name: &'static str,
236 _variant_index: u32,
237 _variant: &'static str,
238 _len: usize,
239 ) -> Result<Self::SerializeStructVariant, Self::Error> {
240 Err(SerializerError::InvalidProtocol)
241 }
242}