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
use serde::Serialize;

use crate::{Litl, TaggedData};

impl Serialize for Litl {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        match self {
            Litl::String(str) => serializer.serialize_str(str),
            Litl::Number(float) => serializer.serialize_f64(**float),
            Litl::Array(arr) => serializer.collect_seq(arr.iter()),
            Litl::Dict(dict) => {
                let (keys, values) = dict.keys_and_values();
                serializer.collect_map(
                    keys.iter()
                        .cloned()
                        .map(Into::<Litl>::into)
                        .zip(values.iter()),
                )
            }
            Litl::Bool(b) => serializer.serialize_bool(*b),
            Litl::Null => serializer.serialize_unit(),
            Litl::TaggedData(TaggedData::Leaf(data)) => serializer.serialize_bytes(data),
            Litl::TaggedData(TaggedData::Nested { tag, inner }) => serializer.collect_map(
                [
                    (&Litl::string("type"), &Litl::string(tag)),
                    (&Litl::string("value"), &**inner),
                ]
                .into_iter(),
            ),
        }
    }
}