domtree/serialize/
serde_impl.rs1use 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}