table/
ser.rs

1// Copyright (C) 2018  Project Tsukurou!
2//
3// This program is free software: you can redistribute it and/or modify
4// it under the terms of the GNU General Public License as published by
5// the Free Software Foundation, either version 3 of the License, or
6// (at your option) any later version.
7//
8// This program is distributed in the hope that it will be useful,
9// but WITHOUT ANY WARRANTY; without even the implied warranty of
10// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11// GNU General Public License for more details.
12//
13// You should have received a copy of the GNU General Public License
14// along with this program.  If not, see <https://www.gnu.org/licenses/>.
15
16use 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}