redust_resp/data/
ser.rs

1use std::{borrow::Cow, num::TryFromIntError};
2
3use serde::{ser, Serialize};
4
5use crate::{array, Data, Error};
6
7/// Serialize `T` into [Data].
8pub fn to_data<T>(value: &T) -> Result<Data<'static>, Error<'static>>
9where
10	T: Serialize,
11{
12	value.serialize(Serializer)
13}
14
15impl<'a> ser::Serialize for Data<'a> {
16	fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
17	where
18		S: serde::Serializer,
19	{
20		match self {
21			Data::SimpleString(str) => str.serialize(serializer),
22			Data::Integer(i) => i.serialize(serializer),
23			Data::BulkString(bytes) => serde_bytes::serialize(bytes, serializer),
24			Data::Array(arr) => arr.serialize(serializer),
25			Data::Null => serializer.serialize_unit(),
26		}
27	}
28}
29
30struct Serializer;
31
32impl ser::Serializer for Serializer {
33	type Ok = Data<'static>;
34
35	type Error = Error<'static>;
36
37	type SerializeSeq = SerializeVec;
38
39	type SerializeTuple = SerializeVec;
40
41	type SerializeTupleStruct = SerializeVec;
42
43	type SerializeTupleVariant = SerializeVariantVec;
44
45	type SerializeMap = SerializeVec;
46
47	type SerializeStruct = SerializeVec;
48
49	type SerializeStructVariant = SerializeVariantVec;
50
51	fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
52		Ok(Data::SimpleString(Cow::Owned(v.to_string())))
53	}
54
55	fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
56		Ok(Data::Integer(v.into()))
57	}
58
59	fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
60		Ok(Data::Integer(v.into()))
61	}
62
63	fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
64		Ok(Data::Integer(v.into()))
65	}
66
67	fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
68		Ok(Data::Integer(v))
69	}
70
71	fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
72		Ok(Data::Integer(v.into()))
73	}
74
75	fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
76		Ok(Data::Integer(v.into()))
77	}
78
79	fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
80		Ok(Data::Integer(v.into()))
81	}
82
83	fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
84		Ok(Data::Integer(v.try_into().map_err::<Self::Error, _>(
85			|e: TryFromIntError| ser::Error::custom(e.to_string()),
86		)?))
87	}
88
89	fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
90		Ok(Data::SimpleString(Cow::Owned(v.to_string())))
91	}
92
93	fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
94		Ok(Data::SimpleString(Cow::Owned(v.to_string())))
95	}
96
97	fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
98		Ok(Data::SimpleString(Cow::Owned(v.to_string())))
99	}
100
101	fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
102		Ok(Data::SimpleString(Cow::Owned(v.to_owned())))
103	}
104
105	fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
106		Ok(Data::BulkString(Cow::Owned(v.to_vec())))
107	}
108
109	fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
110		Ok(Data::Null)
111	}
112
113	fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error>
114	where
115		T: Serialize,
116	{
117		value.serialize(self)
118	}
119
120	fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
121		Ok(Data::Null)
122	}
123
124	fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
125		self.serialize_unit()
126	}
127
128	fn serialize_unit_variant(
129		self,
130		_name: &'static str,
131		_variant_index: u32,
132		variant: &'static str,
133	) -> Result<Self::Ok, Self::Error> {
134		self.serialize_str(variant)
135	}
136
137	fn serialize_newtype_struct<T: ?Sized>(
138		self,
139		_name: &'static str,
140		value: &T,
141	) -> Result<Self::Ok, Self::Error>
142	where
143		T: Serialize,
144	{
145		value.serialize(self)
146	}
147
148	fn serialize_newtype_variant<T: ?Sized>(
149		self,
150		_name: &'static str,
151		_variant_index: u32,
152		variant: &'static str,
153		value: &T,
154	) -> Result<Self::Ok, Self::Error>
155	where
156		T: Serialize,
157	{
158		Ok(array!(Data::simple_string(variant), value.serialize(self)?))
159	}
160
161	fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
162		Ok(SerializeVec {
163			vec: Vec::with_capacity(len.unwrap_or(0)),
164		})
165	}
166
167	fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
168		self.serialize_seq(Some(len))
169	}
170
171	fn serialize_tuple_struct(
172		self,
173		_name: &'static str,
174		len: usize,
175	) -> Result<Self::SerializeTupleStruct, Self::Error> {
176		self.serialize_seq(Some(len))
177	}
178
179	fn serialize_tuple_variant(
180		self,
181		_name: &'static str,
182		_variant_index: u32,
183		variant: &'static str,
184		len: usize,
185	) -> Result<Self::SerializeTupleVariant, Self::Error> {
186		Ok(SerializeVariantVec {
187			name: variant,
188			vec: Vec::with_capacity(len),
189		})
190	}
191
192	fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
193		self.serialize_seq(len)
194	}
195
196	fn serialize_struct(
197		self,
198		_name: &'static str,
199		len: usize,
200	) -> Result<Self::SerializeStruct, Self::Error> {
201		self.serialize_map(Some(len))
202	}
203
204	fn serialize_struct_variant(
205		self,
206		_name: &'static str,
207		_variant_index: u32,
208		variant: &'static str,
209		len: usize,
210	) -> Result<Self::SerializeStructVariant, Self::Error> {
211		Ok(SerializeVariantVec {
212			name: variant,
213			vec: Vec::with_capacity(len * 2),
214		})
215	}
216}
217
218struct SerializeVec {
219	vec: Vec<Data<'static>>,
220}
221
222impl ser::SerializeSeq for SerializeVec {
223	type Ok = Data<'static>;
224
225	type Error = Error<'static>;
226
227	fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
228	where
229		T: Serialize,
230	{
231		self.vec.push(value.serialize(Serializer)?);
232		Ok(())
233	}
234
235	fn end(self) -> Result<Self::Ok, Self::Error> {
236		Ok(Data::Array(self.vec))
237	}
238}
239
240impl ser::SerializeTuple for SerializeVec {
241	type Ok = Data<'static>;
242
243	type Error = Error<'static>;
244
245	fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
246	where
247		T: Serialize,
248	{
249		self.vec.push(value.serialize(Serializer)?);
250		Ok(())
251	}
252
253	fn end(self) -> Result<Self::Ok, Self::Error> {
254		Ok(Data::Array(self.vec))
255	}
256}
257
258impl ser::SerializeTupleStruct for SerializeVec {
259	type Ok = Data<'static>;
260
261	type Error = Error<'static>;
262
263	fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
264	where
265		T: Serialize,
266	{
267		self.vec.push(value.serialize(Serializer)?);
268		Ok(())
269	}
270
271	fn end(self) -> Result<Self::Ok, Self::Error> {
272		Ok(Data::Array(self.vec))
273	}
274}
275
276impl ser::SerializeMap for SerializeVec {
277	type Ok = Data<'static>;
278
279	type Error = Error<'static>;
280
281	fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error>
282	where
283		T: Serialize,
284	{
285		self.vec.push(key.serialize(Serializer)?);
286		Ok(())
287	}
288
289	fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
290	where
291		T: Serialize,
292	{
293		self.vec.push(value.serialize(Serializer)?);
294		Ok(())
295	}
296
297	fn end(self) -> Result<Self::Ok, Self::Error> {
298		Ok(Data::Array(self.vec))
299	}
300}
301
302impl ser::SerializeStruct for SerializeVec {
303	type Ok = Data<'static>;
304
305	type Error = Error<'static>;
306
307	fn serialize_field<T: ?Sized>(
308		&mut self,
309		key: &'static str,
310		value: &T,
311	) -> Result<(), Self::Error>
312	where
313		T: Serialize,
314	{
315		self.vec.push(Data::simple_string(key));
316		self.vec.push(value.serialize(Serializer)?);
317		Ok(())
318	}
319
320	fn end(self) -> Result<Self::Ok, Self::Error> {
321		Ok(Data::Array(self.vec))
322	}
323}
324
325struct SerializeVariantVec {
326	name: &'static str,
327	vec: Vec<Data<'static>>,
328}
329
330impl ser::SerializeTupleVariant for SerializeVariantVec {
331	type Ok = Data<'static>;
332
333	type Error = Error<'static>;
334
335	fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
336	where
337		T: Serialize,
338	{
339		self.vec.push(value.serialize(Serializer)?);
340		Ok(())
341	}
342
343	fn end(self) -> Result<Self::Ok, Self::Error> {
344		let outer = vec![Data::simple_string(self.name), Data::Array(self.vec)];
345
346		Ok(Data::Array(outer))
347	}
348}
349
350impl ser::SerializeStructVariant for SerializeVariantVec {
351	type Ok = Data<'static>;
352
353	type Error = Error<'static>;
354
355	fn serialize_field<T: ?Sized>(
356		&mut self,
357		key: &'static str,
358		value: &T,
359	) -> Result<(), Self::Error>
360	where
361		T: Serialize,
362	{
363		self.vec.push(Data::simple_string(key));
364		self.vec.push(value.serialize(Serializer)?);
365		Ok(())
366	}
367
368	fn end(self) -> Result<Self::Ok, Self::Error> {
369		let outer = vec![Data::simple_string(self.name), Data::Array(self.vec)];
370
371		Ok(Data::Array(outer))
372	}
373}