jmap_tools/json/
ser.rs

1/*
2 * SPDX-FileCopyrightText: 2021 Pascal Seitz <pascal.seitz@gmail.com>
3 *
4 * SPDX-License-Identifier: Apache-2.0 OR MIT
5 */
6
7use crate::json::num::{N, Number};
8use crate::json::value::Value;
9use crate::{Element, Map, Property};
10use serde::ser::{Serialize, Serializer};
11
12impl<P: Property, E: Element> Serialize for Value<'_, P, E> {
13    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
14    where
15        S: Serializer,
16    {
17        match self {
18            Value::Null => serializer.serialize_unit(),
19            Value::Bool(b) => serializer.serialize_bool(*b),
20            Value::Number(n) => n.serialize(serializer),
21            Value::Str(s) => serializer.serialize_str(s),
22            Value::Array(v) => serializer.collect_seq(v),
23            Value::Object(m) => m.serialize(serializer),
24            Value::Element(e) => serializer.serialize_str(e.to_cow().as_ref()),
25        }
26    }
27}
28impl<P: Property, E: Element> Serialize for Map<'_, P, E> {
29    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
30    where
31        S: Serializer,
32    {
33        serializer.collect_map(self.iter())
34    }
35}
36
37impl Serialize for Number {
38    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
39    where
40        S: Serializer,
41    {
42        match self.n {
43            N::PosInt(n) => serializer.serialize_u64(n),
44            N::NegInt(n) => serializer.serialize_i64(n),
45            N::Float(n) => serializer.serialize_f64(n),
46        }
47    }
48}
49
50#[cfg(test)]
51mod tests {
52    use crate::Null;
53
54    #[test]
55    fn serialize_json_test() {
56        let json_obj =
57            r#"{"bool":true,"string_key":"string_val","float":1.23,"i64":-123,"u64":123}"#;
58
59        let val1: crate::Value<'_, Null, Null> = serde_json::from_str(json_obj).unwrap();
60        let deser1: String = serde_json::to_string(&val1).unwrap();
61        assert_eq!(deser1, json_obj);
62    }
63}