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