1use core::range::Range;
2use serde::{Deserialize, Serialize};
3
4#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
6pub struct Attribute {
7 pub name: String,
8 pub value: Option<String>,
9 #[serde(with = "oak_core::serde_range")]
10 pub span: Range<usize>,
11}
12
13#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
15pub enum HtmlNode {
16 Element(Element),
17 Text(Text),
18 Comment(String),
19}
20
21#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
23pub struct Element {
24 pub tag_name: String,
25 pub attributes: Vec<Attribute>,
26 pub children: Vec<HtmlNode>,
27 #[serde(with = "oak_core::serde_range")]
28 pub span: Range<usize>,
29}
30
31#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
33pub struct Text {
34 pub content: String,
35 #[serde(with = "oak_core::serde_range")]
36 pub span: Range<usize>,
37}
38
39#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
41pub struct HtmlDocument {
42 pub nodes: Vec<HtmlNode>,
43}