1use std::{fmt::Display, io::Write};
2
3use serde::ser;
4
5use crate::Error;
6
7#[derive(Debug, Clone)]
9pub enum NullType {
10 BulkString,
11 Array,
12}
13
14impl Default for NullType {
15 fn default() -> Self {
16 Self::BulkString
17 }
18}
19
20#[derive(Debug, Clone, Default)]
22pub struct Options {
23 pub null_type: NullType,
25}
26
27#[derive(Debug, Default)]
29pub struct Serializer<W> {
30 pub output: W,
31 pub options: Options,
32}
33
34impl<W> Serializer<W>
35where
36 W: Write,
37{
38 fn serialize_int<T>(&mut self, v: T) -> crate::Result<'static, ()>
39 where
40 T: Display,
41 {
42 Ok(write!(self.output, ":{}\r\n", v)?)
43 }
44}
45
46impl<'a, W> ser::Serializer for &'a mut Serializer<W>
47where
48 W: Write,
49{
50 type Ok = ();
51
52 type Error = Error<'static>;
53
54 type SerializeSeq = Self;
55
56 type SerializeTuple = Self;
57
58 type SerializeTupleStruct = Self;
59
60 type SerializeTupleVariant = Self;
61
62 type SerializeMap = Self;
63
64 type SerializeStruct = Self;
65
66 type SerializeStructVariant = Self;
67
68 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
69 self.serialize_str(&v.to_string())
70 }
71
72 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
73 self.serialize_int(v)
74 }
75
76 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
77 self.serialize_int(v)
78 }
79
80 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
81 self.serialize_int(v)
82 }
83
84 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
85 self.serialize_int(v)
86 }
87
88 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
89 self.serialize_int(v)
90 }
91
92 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
93 self.serialize_int(v)
94 }
95
96 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
97 self.serialize_int(v)
98 }
99
100 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
101 self.serialize_int(v)
102 }
103
104 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
105 self.serialize_str(&v.to_string())
106 }
107
108 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
109 self.serialize_str(&v.to_string())
110 }
111
112 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
113 self.serialize_str(&v.to_string())
114 }
115
116 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
117 write!(self.output, "+{}\r\n", v)?;
118 Ok(())
119 }
120
121 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
122 write!(self.output, "${}\r\n", v.len())?;
123 self.output.write_all(v)?;
124 self.output.write_all(b"\r\n")?;
125
126 Ok(())
127 }
128
129 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
130 self.serialize_unit()
131 }
132
133 fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error>
134 where
135 T: serde::Serialize,
136 {
137 value.serialize(self)
138 }
139
140 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
141 match self.options.null_type {
142 NullType::Array => self.output.write_all(b"*-1\r\n\r\n")?,
143 NullType::BulkString => self.output.write_all(b"$-1\r\n\r\n")?,
144 }
145
146 Ok(())
147 }
148
149 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
150 self.serialize_unit()
151 }
152
153 fn serialize_unit_variant(
154 self,
155 _name: &'static str,
156 _variant_index: u32,
157 variant: &'static str,
158 ) -> Result<Self::Ok, Self::Error> {
159 self.serialize_str(variant)
160 }
161
162 fn serialize_newtype_struct<T: ?Sized>(
163 self,
164 _name: &'static str,
165 value: &T,
166 ) -> Result<Self::Ok, Self::Error>
167 where
168 T: serde::Serialize,
169 {
170 value.serialize(self)
171 }
172
173 fn serialize_newtype_variant<T: ?Sized>(
174 self,
175 _name: &'static str,
176 _variant_index: u32,
177 variant: &'static str,
178 value: &T,
179 ) -> Result<Self::Ok, Self::Error>
180 where
181 T: serde::Serialize,
182 {
183 write!(self.output, "*2\r\n{}\r\n", variant)?;
184 value.serialize(self)?;
185
186 Ok(())
187 }
188
189 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
190 let len =
191 len.ok_or_else::<Self::Error, _>(|| ser::Error::custom("sequence length required"))?;
192 write!(self.output, "*{}\r\n", len)?;
193
194 Ok(self)
195 }
196
197 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
198 self.serialize_seq(Some(len))
199 }
200
201 fn serialize_tuple_struct(
202 self,
203 _name: &'static str,
204 len: usize,
205 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
206 self.serialize_seq(Some(len))
207 }
208
209 fn serialize_tuple_variant(
210 self,
211 _name: &'static str,
212 _variant_index: u32,
213 variant: &'static str,
214 len: usize,
215 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
216 write!(self.output, "*2\r\n{}\r\n*{}\r\n", variant, len)?;
217
218 Ok(self)
219 }
220
221 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
222 self.serialize_seq(len.map(|l| l * 2))
223 }
224
225 fn serialize_struct(
226 self,
227 _name: &'static str,
228 len: usize,
229 ) -> Result<Self::SerializeStruct, Self::Error> {
230 self.serialize_map(Some(len))
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 write!(self.output, "*2\r\n{}\r\n*{}\r\n", variant, len * 2)?;
241
242 Ok(self)
243 }
244}
245
246impl<'a, W> ser::SerializeSeq for &'a mut Serializer<W>
247where
248 W: Write,
249{
250 type Ok = ();
251
252 type Error = Error<'static>;
253
254 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
255 where
256 T: serde::Serialize,
257 {
258 value.serialize(&mut **self)
259 }
260
261 fn end(self) -> Result<Self::Ok, Self::Error> {
262 Ok(())
263 }
264}
265
266impl<'a, W> ser::SerializeTuple for &'a mut Serializer<W>
267where
268 W: Write,
269{
270 type Ok = ();
271
272 type Error = Error<'static>;
273
274 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
275 where
276 T: serde::Serialize,
277 {
278 value.serialize(&mut **self)
279 }
280
281 fn end(self) -> Result<Self::Ok, Self::Error> {
282 Ok(())
283 }
284}
285
286impl<'a, W> ser::SerializeTupleStruct for &'a mut Serializer<W>
287where
288 W: Write,
289{
290 type Ok = ();
291
292 type Error = Error<'static>;
293
294 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
295 where
296 T: serde::Serialize,
297 {
298 value.serialize(&mut **self)
299 }
300
301 fn end(self) -> Result<Self::Ok, Self::Error> {
302 Ok(())
303 }
304}
305
306impl<'a, W> ser::SerializeTupleVariant for &'a mut Serializer<W>
307where
308 W: Write,
309{
310 type Ok = ();
311
312 type Error = Error<'static>;
313
314 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
315 where
316 T: serde::Serialize,
317 {
318 value.serialize(&mut **self)
319 }
320
321 fn end(self) -> Result<Self::Ok, Self::Error> {
322 Ok(())
323 }
324}
325
326impl<'a, W> ser::SerializeMap for &'a mut Serializer<W>
327where
328 W: Write,
329{
330 type Ok = ();
331
332 type Error = Error<'static>;
333
334 fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error>
335 where
336 T: serde::Serialize,
337 {
338 key.serialize(&mut **self)
339 }
340
341 fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
342 where
343 T: serde::Serialize,
344 {
345 value.serialize(&mut **self)
346 }
347
348 fn end(self) -> Result<Self::Ok, Self::Error> {
349 Ok(())
350 }
351}
352
353impl<'a, W> ser::SerializeStruct for &'a mut Serializer<W>
354where
355 W: Write,
356{
357 type Ok = ();
358
359 type Error = Error<'static>;
360
361 fn serialize_field<T: ?Sized>(
362 &mut self,
363 key: &'static str,
364 value: &T,
365 ) -> Result<(), Self::Error>
366 where
367 T: serde::Serialize,
368 {
369 ser::Serialize::serialize(key, &mut **self)?;
370 ser::Serialize::serialize(value, &mut **self)?;
371
372 Ok(())
373 }
374
375 fn end(self) -> Result<Self::Ok, Self::Error> {
376 Ok(())
377 }
378}
379
380impl<'a, W> ser::SerializeStructVariant for &'a mut Serializer<W>
381where
382 W: Write,
383{
384 type Ok = ();
385
386 type Error = Error<'static>;
387
388 fn serialize_field<T: ?Sized>(
389 &mut self,
390 key: &'static str,
391 value: &T,
392 ) -> Result<(), Self::Error>
393 where
394 T: serde::Serialize,
395 {
396 ser::Serialize::serialize(key, &mut **self)?;
397 ser::Serialize::serialize(value, &mut **self)?;
398
399 Ok(())
400 }
401
402 fn end(self) -> Result<Self::Ok, Self::Error> {
403 Ok(())
404 }
405}