1use std::collections::HashMap;
4
5#[derive(Clone,Debug,PartialEq)]
7pub struct DocumentTree(pub DocumentElement);
8
9impl DocumentTree {
10 pub fn new() -> DocumentTree {
13 DocumentTree(DocumentElement::Function(DocumentFunction {
14 call: "document".to_owned(),
15 args: HashMap::new(),
16 content: Vec::new()
17 }))
18 }
19}
20
21impl Default for DocumentTree {
22 fn default() -> Self {
23 Self::new()
24 }
25}
26
27impl<'lua> mlua::ToLua<'lua> for &DocumentTree {
28 fn to_lua(self, lua: &'lua mlua::Lua) -> mlua::Result<mlua::Value<'lua>> {
29 self.0.to_lua(lua)
30 }
31}
32
33#[derive(Clone,Debug,PartialEq)]
38pub struct DocumentFunction {
39 pub call: String,
40 pub args: HashMap<String, DocumentNode>,
41 pub content: DocumentNode,
42}
43
44impl DocumentFunction {
45 pub fn new() -> DocumentFunction {
47 DocumentFunction { call: "".to_owned(), args: HashMap::new(), content: Vec::new() }
48 }
49
50 pub fn empty_element() -> DocumentElement {
52 DocumentElement::Function(Self::new())
53 }
54}
55
56impl Default for DocumentFunction {
57 fn default() -> Self {
58 Self::new()
59 }
60}
61
62impl<'lua> mlua::ToLua<'lua> for &DocumentFunction {
63 fn to_lua(self, lua: &'lua mlua::Lua) -> mlua::Result<mlua::Value<'lua>> {
65 let node = lua.create_table()?;
66
67 node.set("call", self.call.clone())?;
69
70 let args = lua.create_table()?;
72 for (arg, elements) in self.args.iter() {
73 let lua_value = lua.create_table()?;
74 for (i, element) in elements.iter().enumerate() {
75 lua_value.set(i + 1, element)?;
76 }
77 args.set(arg.as_str(), lua_value)?;
78 }
79 node.set("args", args)?;
80
81 let content = lua.create_table()?;
83 for (i, child) in self.content.iter().enumerate() {
84 content.set(i + 1, child)?;
85 }
86 node.set("content", content)?;
87
88 Ok(mlua::Value::Table(node))
89 }
90}
91
92#[derive(Clone,Debug,PartialEq)]
95pub enum DocumentElement {
96 Function(DocumentFunction),
97 Text(String),
98}
99
100impl<'lua> mlua::ToLua<'lua> for &DocumentElement {
101 fn to_lua(self, lua: &'lua mlua::Lua) -> mlua::Result<mlua::Value<'lua>> {
103 match self {
104 DocumentElement::Function(func) => func.to_lua(lua),
105 DocumentElement::Text(text) => text.clone().to_lua(lua),
106 }
107 }
108}
109
110pub type DocumentNode = Vec<DocumentElement>;