simple_html_parser/
ast.rs

1#[derive(Debug, Clone, PartialEq)]
2pub struct DOCTYPE {}
3
4impl DOCTYPE {
5    pub fn new() -> Self {
6        Self {}
7    }
8}
9
10#[derive(Debug, Clone, PartialEq)]
11pub enum AST {
12    Document(Option<DOCTYPE>, Box<Option<AST>>),
13    Tag(String, Vec<(String, String)>, Vec<AST>),
14    String(String),
15}
16
17impl Default for AST {
18    fn default() -> Self {
19        Self::String(String::new())
20    }
21}
22
23impl AST {
24    pub fn get_element_by_id<T: ToString + Clone>(&self, id: T) -> Option<Self> {
25        println!("id: {}; ast: {:?}", id.to_string(), self);
26        match self {
27            Self::Document(_, thing) => {
28                let thing = &**thing;
29                return thing.as_ref()?.get_element_by_id(id);
30            },
31            Self::Tag(_, attrs, children) => {
32                if attrs.iter().any(|(k, v)| k == "id" && v == &id.to_string()) {
33                    return Some(self.clone());
34                }
35                'el: for ele in children {
36                    if let Self::Tag(_, _, _) = ele {
37                        match ele.get_element_by_id(id.clone()) {
38                            None => {
39                                continue 'el;
40                            },
41                            ele => {return ele}
42                        }    
43                    } else {
44                        continue;
45                    }
46                }
47                return None
48            },
49            Self::String(_) => None
50        }
51    }
52    pub fn inner_text(&self) -> String {
53        match self {
54            Self::Document(_, thing) => {
55                let thing = &**thing;
56                if let Some(thing) = thing {
57                    return thing.inner_text();
58                }
59                return "".to_string();
60            },
61            Self::Tag(_, _, children) => {
62                let mut result = String::new();
63
64                for ele in children {
65                    result += &ele.inner_text();
66                }
67                return result;
68            }
69            Self::String(text) => text.to_string()
70        }
71    }
72}