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(),
),
}
}
}