1use std::{
2 borrow::Cow,
3 cell::RefCell,
4 collections::HashMap,
5 convert::TryFrom,
6 rc::Rc,
7 sync::{Arc, Mutex},
8};
9
10use crate::{Error, Intermediate, Map, Number};
11
12pub trait Serialize {
17 fn serialize(&self) -> Result<Intermediate, Error>;
19}
20
21impl Serialize for bool {
22 #[inline]
23 fn serialize(&self) -> Result<Intermediate, Error> {
24 Ok(Intermediate::Bool(*self))
25 }
26}
27
28impl Serialize for i64 {
29 #[inline]
30 fn serialize(&self) -> Result<Intermediate, Error> {
31 Ok(Intermediate::Number(Number::SignedInt(*self)))
32 }
33}
34
35impl Serialize for u64 {
36 #[inline]
37 fn serialize(&self) -> Result<Intermediate, Error> {
38 Ok(Intermediate::Number(Number::UnsignedInt(*self)))
39 }
40}
41
42impl Serialize for f32 {
43 #[inline]
44 fn serialize(&self) -> Result<Intermediate, Error> {
45 Ok(Intermediate::Number(Number::Float(*self as _)))
46 }
47}
48
49impl Serialize for f64 {
50 #[inline]
51 fn serialize(&self) -> Result<Intermediate, Error> {
52 Ok(Intermediate::Number(Number::Float(*self)))
53 }
54}
55
56macro_rules! serialize_for_signed_int {
57 ( $x:ty ) => {
58 impl Serialize for $x {
59 #[inline]
60 fn serialize(&self) -> Result<Intermediate, Error> {
61 Ok(Intermediate::Number(Number::SignedInt(i64::from(*self))))
62 }
63 }
64 };
65}
66
67macro_rules! serialize_for_unsigned_int {
68 ( $x:ty ) => {
69 impl Serialize for $x {
70 #[inline]
71 fn serialize(&self) -> Result<Intermediate, Error> {
72 Ok(Intermediate::Number(Number::UnsignedInt(u64::from(*self))))
73 }
74 }
75 };
76}
77
78serialize_for_signed_int!(i8);
79serialize_for_signed_int!(i16);
80serialize_for_signed_int!(i32);
81
82serialize_for_unsigned_int!(u8);
83serialize_for_unsigned_int!(u16);
84serialize_for_unsigned_int!(u32);
85
86impl Serialize for i128 {
87 #[inline]
88 fn serialize(&self) -> Result<Intermediate, Error> {
89 i64::try_from(*self)
90 .map(|v| Intermediate::Number(Number::SignedInt(v)))
91 .map_err(|_| Error::OutOfBounds)
92 }
93}
94
95impl Serialize for u128 {
96 #[inline]
97 fn serialize(&self) -> Result<Intermediate, Error> {
98 u64::try_from(*self)
99 .map(|v| Intermediate::Number(Number::UnsignedInt(v)))
100 .map_err(|_| Error::OutOfBounds)
101 }
102}
103
104impl Serialize for isize {
105 #[inline]
106 fn serialize(&self) -> Result<Intermediate, Error> {
107 i64::try_from(*self)
108 .map(|v| Intermediate::Number(Number::SignedInt(v)))
109 .map_err(|_| Error::OutOfBounds)
110 }
111}
112
113impl Serialize for usize {
114 #[inline]
115 fn serialize(&self) -> Result<Intermediate, Error> {
116 u64::try_from(*self)
117 .map(|v| Intermediate::Number(Number::UnsignedInt(v)))
118 .map_err(|_| Error::OutOfBounds)
119 }
120}
121
122impl Serialize for char {
123 #[inline]
124 fn serialize(&self) -> Result<Intermediate, Error> {
125 Ok(Intermediate::String(Cow::Owned(self.to_string())))
126 }
127}
128
129impl Serialize for String {
130 #[inline]
131 fn serialize(&self) -> Result<Intermediate, Error> {
132 Ok(Intermediate::String(Cow::Owned(self.clone())))
133 }
134}
135
136impl Serialize for &str {
137 #[inline]
138 fn serialize(&self) -> Result<Intermediate, Error> {
139 Ok(Intermediate::String(Cow::Owned(String::from(*self))))
140 }
141}
142
143impl<T> Serialize for Option<T>
144where
145 T: Serialize,
146{
147 #[inline]
148 fn serialize(&self) -> Result<Intermediate, Error> {
149 if let Some(inner) = self.as_ref() {
150 inner.serialize()
151 } else {
152 Ok(Intermediate::None)
153 }
154 }
155}
156
157impl<T> Serialize for &[T]
158where
159 T: Serialize,
160{
161 #[inline]
162 fn serialize(&self) -> Result<Intermediate, Error> {
163 serialize_slice(self)
164 }
165}
166
167impl<T> Serialize for &mut [T]
168where
169 T: Serialize,
170{
171 #[inline]
172 fn serialize(&self) -> Result<Intermediate, Error> {
173 serialize_slice(self)
174 }
175}
176
177impl<T> Serialize for Vec<T>
178where
179 T: Serialize,
180{
181 #[inline]
182 fn serialize(&self) -> Result<Intermediate, Error> {
183 serialize_slice(self)
184 }
185}
186
187impl<T> Serialize for [T; 0] {
188 #[inline]
189 fn serialize(&self) -> Result<Intermediate, Error> {
190 Ok(Intermediate::Array(Vec::new()))
191 }
192}
193
194macro_rules! serialize_array {
195 ( $len:expr ) => {
196 impl<T> Serialize for [T; $len]
197 where
198 T: Serialize,
199 {
200 #[inline]
201 fn serialize(&self) -> Result<Intermediate, Error> {
202 serialize_slice(&self[..])
203 }
204 }
205 };
206}
207
208serialize_array!(1);
209serialize_array!(2);
210serialize_array!(3);
211serialize_array!(4);
212serialize_array!(5);
213serialize_array!(6);
214serialize_array!(7);
215serialize_array!(8);
216serialize_array!(9);
217serialize_array!(10);
218serialize_array!(11);
219serialize_array!(12);
220serialize_array!(13);
221serialize_array!(14);
222serialize_array!(15);
223serialize_array!(16);
224serialize_array!(17);
225serialize_array!(18);
226serialize_array!(19);
227serialize_array!(20);
228serialize_array!(21);
229serialize_array!(22);
230serialize_array!(23);
231serialize_array!(24);
232serialize_array!(25);
233serialize_array!(26);
234serialize_array!(27);
235serialize_array!(28);
236serialize_array!(29);
237serialize_array!(30);
238serialize_array!(31);
239serialize_array!(32);
240
241impl Serialize for () {
242 #[inline]
243 fn serialize(&self) -> Result<Intermediate, Error> {
244 Ok(Intermediate::Array(Vec::new()))
245 }
246}
247
248macro_rules! serialize_tuple {
249 ( $len:expr => ($($n:tt $ty:ident)+) ) => {
250 impl<$($ty),+> Serialize for ($($ty,)+)
251 where
252 $($ty: Serialize,)+
253 {
254 fn serialize(&self) -> Result<Intermediate, Error> {
255 let res = vec![
256 $(
257 self.$n.serialize()?,
258 )+
259 ];
260
261 Ok(Intermediate::Array(res))
262 }
263 }
264 };
265}
266
267serialize_tuple!(1 => (0 T0));
268serialize_tuple!(2 => (0 T0 1 T1));
269serialize_tuple!(3 => (0 T0 1 T1 2 T2));
270serialize_tuple!(4 => (0 T0 1 T1 2 T2 3 T3));
271serialize_tuple!(5 => (0 T0 1 T1 2 T2 3 T3 4 T4));
272serialize_tuple!(6 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5));
273serialize_tuple!(7 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6));
274serialize_tuple!(8 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7));
275serialize_tuple!(9 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8));
276serialize_tuple!(10 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9));
277serialize_tuple!(11 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10));
278serialize_tuple!(12 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11));
279serialize_tuple!(13 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12));
280serialize_tuple!(14 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13));
281serialize_tuple!(15 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14));
282serialize_tuple!(16 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15));
283
284impl<K, V> Serialize for HashMap<K, V>
285where
286 K: ToString,
287 V: Serialize,
288{
289 fn serialize(&self) -> Result<Intermediate, Error> {
290 let mut res = Map::with_capacity(self.len());
291
292 for (k, v) in self.iter() {
293 res.insert_with_owned_key(k.to_string(), v.serialize()?);
294 }
295
296 Ok(Intermediate::Map(res))
297 }
298}
299
300#[cfg(feature = "preserve-order")]
301impl<K, V> Serialize for indexmap::IndexMap<K, V>
302where
303 K: ToString,
304 V: Serialize,
305{
306 fn serialize(&self) -> Result<Intermediate, Error> {
307 let mut res = Map::with_capacity(self.len());
308
309 for (k, v) in self.iter() {
310 res.insert_with_owned_key(k.to_string(), v.serialize()?);
311 }
312
313 Ok(Intermediate::Map(res))
314 }
315}
316
317impl<T> Serialize for &T
318where
319 T: Serialize + ?Sized,
320{
321 #[inline]
322 fn serialize(&self) -> Result<Intermediate, Error> {
323 <T as Serialize>::serialize(self)
324 }
325}
326
327impl<T> Serialize for &mut T
328where
329 T: Serialize + ?Sized,
330{
331 #[inline]
332 fn serialize(&self) -> Result<Intermediate, Error> {
333 <T as Serialize>::serialize(self)
334 }
335}
336
337macro_rules! serialize_wrapper {
338 ( $x:ident ) => {
339 impl<T> Serialize for $x<T>
340 where
341 T: Serialize + ?Sized,
342 {
343 #[inline]
344 fn serialize(&self) -> Result<Intermediate, Error> {
345 <T as Serialize>::serialize(&*self)
346 }
347 }
348 };
349}
350
351serialize_wrapper!(Box);
352serialize_wrapper!(Rc);
353serialize_wrapper!(Arc);
354
355impl<T> Serialize for Mutex<T>
356where
357 T: Serialize + ?Sized,
358{
359 #[inline]
360 fn serialize(&self) -> Result<Intermediate, Error> {
361 self.lock().unwrap().serialize()
362 }
363}
364
365impl<T> Serialize for RefCell<T>
366where
367 T: Serialize + ?Sized,
368{
369 #[inline]
370 fn serialize(&self) -> Result<Intermediate, Error> {
371 self.borrow().serialize()
372 }
373}
374
375fn serialize_slice<T>(v: &[T]) -> Result<Intermediate, Error>
377where
378 T: Serialize,
379{
380 let mut res = Vec::with_capacity(v.len());
381
382 for elem in v.iter() {
383 res.push(elem.serialize()?);
384 }
385
386 Ok(Intermediate::Array(res))
387}