1use crate::{Error, Map, Object, Result};
4use serde::{ser, Serialize};
5use std::result;
6
7pub fn to_object<T>(value: T) -> Result<Object>
9where
10 T: Serialize,
11{
12 value.serialize(Serializer)
13}
14
15impl Serialize for Object {
16 fn serialize<S>(&self, serializer: S) -> result::Result<S::Ok, S::Error>
17 where
18 S: ser::Serializer,
19 {
20 match self {
21 Object::Null => serializer.serialize_unit(),
22 Object::Boolean(value) => serializer.serialize_bool(*value),
23 Object::Integer(value) => serializer.serialize_i64(*value),
24 Object::Float(value) => serializer.serialize_f64(*value),
25 Object::String(value) => serializer.serialize_str(value),
26 Object::Raw(value) => serializer.serialize_bytes(value),
27 Object::List(value) => value.serialize(serializer),
28 Object::Map(value) => value.serialize(serializer),
29 }
30 }
31}
32
33#[derive(Copy, Clone)]
35pub struct Serializer;
36
37impl ser::Serializer for Serializer {
38 type Ok = Object;
39 type Error = Error;
40
41 type SerializeSeq = SerializeList;
42 type SerializeTuple = SerializeList;
43 type SerializeTupleStruct = SerializeList;
44 type SerializeTupleVariant = SerializeListVariant;
45 type SerializeMap = SerializeMap;
46 type SerializeStruct = SerializeList;
47 type SerializeStructVariant = SerializeListVariant;
48
49 fn serialize_bool(self, value: bool) -> Result<Object> {
50 Ok(Object::Boolean(value))
51 }
52
53 fn serialize_i8(self, value: i8) -> Result<Object> {
54 self.serialize_i64(value as i64)
55 }
56
57 fn serialize_i16(self, value: i16) -> Result<Object> {
58 self.serialize_i64(value as i64)
59 }
60
61 fn serialize_i32(self, value: i32) -> Result<Object> {
62 self.serialize_i64(value as i64)
63 }
64
65 fn serialize_i64(self, value: i64) -> Result<Object> {
66 Ok(Object::Integer(value))
67 }
68
69 fn serialize_u8(self, value: u8) -> Result<Object> {
70 self.serialize_i64(value as i64)
71 }
72
73 fn serialize_u16(self, value: u16) -> Result<Object> {
74 self.serialize_i64(value as i64)
75 }
76
77 fn serialize_u32(self, value: u32) -> Result<Object> {
78 self.serialize_i64(value as i64)
79 }
80
81 fn serialize_u64(self, value: u64) -> Result<Object> {
82 if value <= i64::MAX as u64 {
83 self.serialize_i64(value as i64)
84 } else {
85 Err(Error::InvalidValue)
86 }
87 }
88
89 fn serialize_f32(self, value: f32) -> Result<Object> {
90 self.serialize_f64(value as f64)
91 }
92
93 fn serialize_f64(self, value: f64) -> Result<Object> {
94 Ok(Object::Float(value))
95 }
96
97 fn serialize_char(self, value: char) -> Result<Object> {
98 self.serialize_i64(value as i64)
99 }
100
101 fn serialize_str(self, value: &str) -> Result<Object> {
102 Ok(Object::String(value.into()))
103 }
104
105 fn serialize_bytes(self, value: &[u8]) -> Result<Object> {
106 Ok(Object::Raw(value.into()))
107 }
108
109 fn serialize_unit(self) -> Result<Object> {
110 Ok(Object::Null)
111 }
112
113 fn serialize_unit_struct(self, _name: &'static str) -> Result<Object> {
114 self.serialize_unit()
115 }
116
117 fn serialize_unit_variant(
118 self,
119 _name: &'static str,
120 variant_index: u32,
121 _variant: &'static str,
122 ) -> Result<Object> {
123 self.serialize_u32(variant_index)
124 }
125
126 fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<Object>
127 where
128 T: ?Sized + Serialize,
129 {
130 value.serialize(self)
131 }
132
133 fn serialize_newtype_variant<T>(
134 self,
135 _name: &'static str,
136 variant_index: u32,
137 _variant: &'static str,
138 value: &T,
139 ) -> Result<Object>
140 where
141 T: ?Sized + Serialize,
142 {
143 Ok(Object::List(vec![
144 Serializer.serialize_u32(variant_index)?,
145 value.serialize(self)?,
146 ]))
147 }
148
149 fn serialize_none(self) -> Result<Object> {
150 self.serialize_unit()
151 }
152
153 fn serialize_some<T>(self, value: &T) -> Result<Object>
154 where
155 T: ?Sized + Serialize,
156 {
157 value.serialize(self)
158 }
159
160 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq> {
161 Ok(SerializeList {
162 list: Vec::with_capacity(len.unwrap_or(0)),
163 })
164 }
165
166 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> {
167 self.serialize_seq(Some(len))
168 }
169
170 fn serialize_tuple_struct(
171 self,
172 _name: &'static str,
173 len: usize,
174 ) -> Result<Self::SerializeTupleStruct> {
175 self.serialize_tuple(len)
176 }
177
178 fn serialize_tuple_variant(
179 self,
180 _name: &'static str,
181 variant_index: u32,
182 _variant: &'static str,
183 len: usize,
184 ) -> Result<Self::SerializeTupleVariant> {
185 use ser::SerializeTuple;
186 let mut outer = self.serialize_tuple(2)?;
187 outer.serialize_element(&variant_index)?;
188 let inner = self.serialize_tuple(len)?;
189 Ok(SerializeListVariant { outer, inner })
190 }
191
192 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
193 Ok(SerializeMap {
194 map: Map::new(),
195 next_key: None,
196 })
197 }
198
199 fn serialize_struct(self, _name: &'static str, len: usize) -> Result<Self::SerializeStruct> {
200 self.serialize_tuple(len)
201 }
202
203 fn serialize_struct_variant(
204 self,
205 name: &'static str,
206 variant_index: u32,
207 variant: &'static str,
208 len: usize,
209 ) -> Result<Self::SerializeStructVariant> {
210 self.serialize_tuple_variant(name, variant_index, variant, len)
211 }
212}
213
214pub struct SerializeList {
215 list: Vec<Object>,
216}
217
218impl ser::SerializeSeq for SerializeList {
219 type Ok = Object;
220 type Error = Error;
221
222 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
223 where
224 T: ?Sized + Serialize,
225 {
226 self.list.push(to_object(value)?);
227 Ok(())
228 }
229
230 fn end(self) -> Result<Object> {
231 Ok(Object::List(self.list))
232 }
233}
234
235impl ser::SerializeTuple for SerializeList {
236 type Ok = Object;
237 type Error = Error;
238
239 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
240 where
241 T: ?Sized + Serialize,
242 {
243 ser::SerializeSeq::serialize_element(self, value)
244 }
245
246 fn end(self) -> Result<Object> {
247 ser::SerializeSeq::end(self)
248 }
249}
250
251impl ser::SerializeTupleStruct for SerializeList {
252 type Ok = Object;
253 type Error = Error;
254
255 fn serialize_field<T>(&mut self, value: &T) -> Result<()>
256 where
257 T: ?Sized + Serialize,
258 {
259 ser::SerializeSeq::serialize_element(self, value)
260 }
261
262 fn end(self) -> Result<Object> {
263 ser::SerializeSeq::end(self)
264 }
265}
266
267impl ser::SerializeStruct for SerializeList {
268 type Ok = Object;
269 type Error = Error;
270
271 fn serialize_field<T>(&mut self, _name: &'static str, value: &T) -> Result<()>
272 where
273 T: ?Sized + Serialize,
274 {
275 ser::SerializeSeq::serialize_element(self, value)
276 }
277
278 fn end(self) -> Result<Object> {
279 ser::SerializeSeq::end(self)
280 }
281}
282
283pub struct SerializeListVariant {
284 inner: SerializeList,
285 outer: SerializeList,
286}
287
288impl ser::SerializeTupleVariant for SerializeListVariant {
289 type Ok = Object;
290 type Error = Error;
291
292 fn serialize_field<T>(&mut self, value: &T) -> Result<()>
293 where
294 T: ?Sized + Serialize,
295 {
296 ser::SerializeTuple::serialize_element(&mut self.inner, value)
297 }
298
299 fn end(mut self) -> Result<Object> {
300 let obj = ser::SerializeSeq::end(self.inner)?;
301 ser::SerializeTuple::serialize_element(&mut self.outer, &obj)?;
302 ser::SerializeSeq::end(self.outer)
303 }
304}
305
306impl ser::SerializeStructVariant for SerializeListVariant {
307 type Ok = Object;
308 type Error = Error;
309
310 fn serialize_field<T>(&mut self, _name: &'static str, value: &T) -> Result<()>
311 where
312 T: ?Sized + Serialize,
313 {
314 ser::SerializeTupleVariant::serialize_field(self, value)
315 }
316
317 fn end(self) -> Result<Object> {
318 ser::SerializeTupleVariant::end(self)
319 }
320}
321
322pub struct SerializeMap {
323 map: Map,
324 next_key: Option<String>,
325}
326
327impl ser::SerializeMap for SerializeMap {
328 type Ok = Object;
329 type Error = Error;
330
331 fn serialize_key<T>(&mut self, key: &T) -> Result<()>
332 where
333 T: ?Sized + Serialize,
334 {
335 self.next_key = Some(key.serialize(KeySerializer)?);
336 Ok(())
337 }
338
339 fn serialize_value<T>(&mut self, value: &T) -> Result<()>
340 where
341 T: ?Sized + Serialize,
342 {
343 let key = self
345 .next_key
346 .take()
347 .expect("serialize_value called before serialize_key");
348 self.map.insert(key, to_object(value)?);
349 Ok(())
350 }
351
352 fn end(self) -> Result<Object> {
353 Ok(Object::Map(self.map))
354 }
355}
356
357struct KeySerializer;
358
359impl ser::Serializer for KeySerializer {
360 type Ok = String;
361 type Error = Error;
362
363 type SerializeSeq = ser::Impossible<String, Error>;
364 type SerializeTuple = ser::Impossible<String, Error>;
365 type SerializeTupleStruct = ser::Impossible<String, Error>;
366 type SerializeTupleVariant = ser::Impossible<String, Error>;
367 type SerializeMap = ser::Impossible<String, Error>;
368 type SerializeStruct = ser::Impossible<String, Error>;
369 type SerializeStructVariant = ser::Impossible<String, Error>;
370
371 fn serialize_bool(self, _value: bool) -> Result<String> {
372 Err(Error::WrongType)
373 }
374
375 fn serialize_i8(self, _value: i8) -> Result<String> {
376 Err(Error::WrongType)
377 }
378
379 fn serialize_i16(self, _value: i16) -> Result<String> {
380 Err(Error::WrongType)
381 }
382
383 fn serialize_i32(self, _value: i32) -> Result<String> {
384 Err(Error::WrongType)
385 }
386
387 fn serialize_i64(self, _value: i64) -> Result<String> {
388 Err(Error::WrongType)
389 }
390
391 fn serialize_u8(self, _value: u8) -> Result<String> {
392 Err(Error::WrongType)
393 }
394
395 fn serialize_u16(self, _value: u16) -> Result<String> {
396 Err(Error::WrongType)
397 }
398
399 fn serialize_u32(self, _value: u32) -> Result<String> {
400 Err(Error::WrongType)
401 }
402
403 fn serialize_u64(self, _value: u64) -> Result<String> {
404 Err(Error::WrongType)
405 }
406
407 fn serialize_f32(self, _value: f32) -> Result<String> {
408 Err(Error::WrongType)
409 }
410
411 fn serialize_f64(self, _value: f64) -> Result<String> {
412 Err(Error::WrongType)
413 }
414
415 fn serialize_char(self, _value: char) -> Result<String> {
416 Err(Error::WrongType)
417 }
418
419 fn serialize_str(self, value: &str) -> Result<String> {
420 Ok(value.into())
421 }
422
423 fn serialize_bytes(self, _value: &[u8]) -> Result<String> {
424 Err(Error::WrongType)
425 }
426
427 fn serialize_unit(self) -> Result<String> {
428 Err(Error::WrongType)
429 }
430
431 fn serialize_unit_struct(self, _name: &'static str) -> Result<String> {
432 Err(Error::WrongType)
433 }
434
435 fn serialize_unit_variant(
436 self,
437 _name: &'static str,
438 _variant_index: u32,
439 _variant: &'static str,
440 ) -> Result<String> {
441 Err(Error::WrongType)
442 }
443
444 fn serialize_newtype_struct<T>(self, _name: &'static str, _value: &T) -> Result<String>
445 where
446 T: ?Sized + Serialize,
447 {
448 Err(Error::WrongType)
449 }
450
451 fn serialize_newtype_variant<T>(
452 self,
453 _name: &'static str,
454 _variant_index: u32,
455 _variant: &'static str,
456 _value: &T,
457 ) -> Result<String>
458 where
459 T: ?Sized + Serialize,
460 {
461 Err(Error::WrongType)
462 }
463
464 fn serialize_none(self) -> Result<String> {
465 Err(Error::WrongType)
466 }
467
468 fn serialize_some<T>(self, _value: &T) -> Result<String>
469 where
470 T: ?Sized + Serialize,
471 {
472 Err(Error::WrongType)
473 }
474
475 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
476 Err(Error::WrongType)
477 }
478
479 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
480 Err(Error::WrongType)
481 }
482
483 fn serialize_tuple_struct(
484 self,
485 _name: &'static str,
486 _len: usize,
487 ) -> Result<Self::SerializeTupleStruct> {
488 Err(Error::WrongType)
489 }
490
491 fn serialize_tuple_variant(
492 self,
493 _name: &'static str,
494 _variant_index: u32,
495 _variant: &'static str,
496 _len: usize,
497 ) -> Result<Self::SerializeTupleVariant> {
498 Err(Error::WrongType)
499 }
500
501 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
502 Err(Error::WrongType)
503 }
504
505 fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
506 Err(Error::WrongType)
507 }
508
509 fn serialize_struct_variant(
510 self,
511 _name: &'static str,
512 _variant_index: u32,
513 _variant: &'static str,
514 _len: usize,
515 ) -> Result<Self::SerializeStructVariant> {
516 Err(Error::WrongType)
517 }
518}
519
520#[cfg(test)]
521mod test {
522 use super::*;
523 use serde::Serialize;
524 use std::collections::HashMap;
525
526 #[test]
527 fn to_object_maps() {
528 let mut map = HashMap::new();
529 map.insert("foo", 123u32);
530 map.insert("bar", 456u32);
531 let obj = to_object(&map).unwrap();
532
533 let mut expected = Map::new();
534 expected.insert("foo".to_string(), Object::Integer(123));
535 expected.insert("bar".to_string(), Object::Integer(456));
536 assert_eq!(Object::Map(expected), obj);
537 }
538
539 #[test]
540 fn to_object_structs() {
541 #[derive(Serialize)]
542 struct Test {
543 x: bool,
544 y: u32,
545 z: Vec<String>,
546 }
547
548 let s = Test {
549 x: true,
550 y: 17,
551 z: vec!["foo".into(), "bar".into()],
552 };
553 let obj = to_object(&s).unwrap();
554 assert_eq!(
555 Object::List(vec![
556 Object::Boolean(true),
557 Object::Integer(17),
558 Object::List(vec![
559 Object::String("foo".into()),
560 Object::String("bar".into())
561 ])
562 ]),
563 obj
564 );
565 }
566
567 #[test]
568 fn to_object_enums() {
569 #[derive(Serialize)]
570 enum Test {
571 UnitVariant,
572 NewTypeVariant(u32),
573 TupleVariant(bool, u32),
574 StructVariant { x: bool, y: u32 },
575 }
576
577 let e = Test::UnitVariant;
578 let obj = to_object(&e).unwrap();
579 assert_eq!(Object::Integer(0), obj);
580
581 let e = Test::NewTypeVariant(17);
582 let obj = to_object(&e).unwrap();
583 assert_eq!(
584 Object::List(vec![Object::Integer(1), Object::Integer(17)]),
585 obj
586 );
587
588 let e = Test::TupleVariant(true, 17);
589 let obj = to_object(&e).unwrap();
590 assert_eq!(
591 Object::List(vec![
592 Object::Integer(2),
593 Object::List(vec![Object::Boolean(true), Object::Integer(17)])
594 ]),
595 obj
596 );
597
598 let e = Test::StructVariant { x: true, y: 17 };
599 let obj = to_object(&e).unwrap();
600 assert_eq!(
601 Object::List(vec![
602 Object::Integer(3),
603 Object::List(vec![Object::Boolean(true), Object::Integer(17)])
604 ]),
605 obj
606 );
607 }
608
609 #[test]
610 fn to_object_options() {
611 let o: Option<u32> = None;
612 let obj = to_object(&o).unwrap();
613 assert_eq!(Object::Null, obj);
614
615 let o = Some(17);
616 let obj = to_object(&o).unwrap();
617 assert_eq!(Object::Integer(17), obj);
618 }
619}