use serde::{Deserialize, Serialize};
use crate::{Document, ElementBreakdown, Node};
impl Node {
pub fn breakdown(&self, doc: &Document) -> NodeBreakdown {
NodeBreakdown::new(self.clone(), doc)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "type", content = "value")]
pub enum NodeBreakdown {
Element(ElementBreakdown),
Text(String),
Comment(String),
CData(String),
PI(String),
DocType(String),
}
macro_rules! enum_is {
[
$(
$(#[$docs:meta])*
$fn_name:ident => $name:ident
),*
] => {
$(
$(#[$docs])*
pub fn $fn_name(&self) -> bool {
matches!(self, NodeBreakdown::$name(_))
}
)*
};
}
impl NodeBreakdown {
pub fn new(node: Node, doc: &Document) -> Self {
match node {
Node::Element(element) => NodeBreakdown::Element(ElementBreakdown::new(element, doc)),
Node::Text(text) => NodeBreakdown::Text(text),
Node::Comment(comment) => NodeBreakdown::Comment(comment),
Node::CData(cdata) => NodeBreakdown::CData(cdata),
Node::PI(pi) => NodeBreakdown::PI(pi),
Node::DocType(doctype) => NodeBreakdown::DocType(doctype),
}
}
enum_is![
is_element => Element,
is_text => Text,
is_comment => Comment,
is_cdata => CData,
is_pi => PI,
is_doctype => DocType
];
}