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