Skip to main content

domtree/serialize/
serde_impl.rs

1//! Optional `serde::Serialize` impls.
2//!
3//! These produce byte-for-byte the same JSON shape as the zero-dependency
4//! [`Dom::to_json`](crate::Dom::to_json), so the two paths agree (pinned by a
5//! roundtrip test). Only `Serialize` is provided — the tree is a parse *output*,
6//! not something you deserialize into.
7
8use serde::ser::{Serialize, SerializeMap, SerializeSeq, SerializeStruct, Serializer};
9
10use crate::node::NodeKind;
11use crate::tree::{Dom, NodeRef};
12
13impl Serialize for Dom {
14    fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
15        let mut st = s.serialize_struct("document", 3)?;
16        st.serialize_field("type", "document")?;
17        st.serialize_field("errors", &self.errors().len())?;
18        st.serialize_field("children", &Forest(self))?;
19        st.end()
20    }
21}
22
23struct Forest<'a>(&'a Dom);
24
25impl Serialize for Forest<'_> {
26    fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
27        let mut seq = s.serialize_seq(None)?;
28        for r in self.0.roots() {
29            seq.serialize_element(&r)?;
30        }
31        seq.end()
32    }
33}
34
35impl<'a> Serialize for NodeRef<'a> {
36    fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
37        match self.kind() {
38            NodeKind::Element { tag } => {
39                let mut st = s.serialize_struct("element", 4)?;
40                st.serialize_field("type", "element")?;
41                st.serialize_field("tag", tag)?;
42                st.serialize_field("attrs", &AttrMap(*self))?;
43                st.serialize_field("children", &Children(*self))?;
44                st.end()
45            }
46            NodeKind::Text(t) => two_field(s, "text", t),
47            NodeKind::Comment(c) => two_field(s, "comment", c),
48            NodeKind::Doctype(d) => two_field(s, "doctype", d),
49        }
50    }
51}
52
53fn two_field<S: Serializer>(s: S, ty: &'static str, value: &str) -> Result<S::Ok, S::Error> {
54    let mut st = s.serialize_struct(ty, 2)?;
55    st.serialize_field("type", ty)?;
56    st.serialize_field("value", value)?;
57    st.end()
58}
59
60struct AttrMap<'a>(NodeRef<'a>);
61
62impl Serialize for AttrMap<'_> {
63    fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
64        let mut m = s.serialize_map(None)?;
65        for (k, v) in self.0.attributes() {
66            m.serialize_entry(k, v)?;
67        }
68        m.end()
69    }
70}
71
72struct Children<'a>(NodeRef<'a>);
73
74impl Serialize for Children<'_> {
75    fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
76        let mut seq = s.serialize_seq(None)?;
77        for c in self.0.children() {
78            seq.serialize_element(&c)?;
79        }
80        seq.end()
81    }
82}