1use std::{borrow::Cow, num::TryFromIntError};
2
3use serde::{ser, Serialize};
4
5use crate::{array, Data, Error};
6
7pub 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}