redust_resp/ser/
serializer.rs

1use std::{fmt::Display, io::Write};
2
3use serde::ser;
4
5use crate::Error;
6
7/// Null types available in RESP.
8#[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/// Options for the RESP [Serializer].
21#[derive(Debug, Clone, Default)]
22pub struct Options {
23	/// The type to use for serializing missing Optional values.
24	pub null_type: NullType,
25}
26
27/// RESP serializer.
28#[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}