rainbow_core/renderer/from_html/
mod.rs

1use html_parser::{Dom, Node};
2
3use crate::Result;
4
5use crate::{Element, RainbowError, RenderNode};
6
7impl TryFrom<Dom> for RenderNode {
8    type Error = RainbowError;
9
10    fn try_from(dom: Dom) -> Result<Self> {
11        if !dom.errors.is_empty() {
12            return Err(RainbowError::syntax_error(dom.errors[0].to_string()));
13        }
14        let mut root = vec![];
15        for node in dom.children {
16            root.push(RenderNode::try_from(node)?)
17        }
18        Ok(RenderNode::Root(root))
19    }
20}
21
22impl TryFrom<Node> for RenderNode {
23    type Error = RainbowError;
24
25    fn try_from(node: Node) -> Result<Self> {
26        match node {
27            Node::Text(v) => Ok(RenderNode::Text(v)),
28            Node::Element(v) => Ok(RenderNode::Element(Element::try_from(v)?)),
29            Node::Comment(_) => Ok(RenderNode::Text(String::new())),
30        }
31    }
32}
33
34impl TryFrom<html_parser::Element> for Element {
35    type Error = RainbowError;
36
37    fn try_from(element: html_parser::Element) -> Result<Self> {
38        Ok(Element {
39            name: element.name.split(".").map(|s| s.to_string()).collect(),
40            attributes: Default::default(),
41            children: vec![],
42        })
43    }
44}