1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use serde::ser::{SerializeMap, SerializeSeq};
use serde::{Serialize, Serializer};
use crate::value::number::Number;
use crate::value::Value;

impl Serialize for Value {
    fn serialize<S: Serializer>(&self, ser: S) -> Result<S::Ok, S::Error> {
        match self {
            Value::String(v) => ser.serialize_str(v),
            Value::Bool(v) => ser.serialize_bool(*v),
            Value::Number(v) => v.serialize(ser),
            Value::None => ser.serialize_none(),
            Value::Map(v) => {
                let mut map = ser.serialize_map(Some(v.len()))?;
                for (key, val) in v {
                    map.serialize_entry(key, val)?;
                }

                map.end()
            }
            Value::Array(v) => {
                let mut seq = ser.serialize_seq(Some(v.len()))?;
                for elem in v {
                    seq.serialize_element(elem)?;
                }

                seq.end()
            }
        }
    }
}

impl Serialize for Number {
    fn serialize<S: Serializer>(&self, ser: S) -> Result<S::Ok, S::Error> {
        match *self {
            Number::Integer(v) => ser.serialize_i64(v),
            Number::Float(v) => ser.serialize_f64(v),
            Number::UInteger(v) => ser.serialize_u64(v)
        }
    }
}