1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
use std::collections::HashMap;
use std::rc::Rc;
use std::cmp::PartialEq;
use crate::virtualdom::models::vdom_node::VDomNode;
use crate::virtualdom::models::{
css::Css,
node_attr::NodeAttr,
};
pub struct VDomElement {
pub name: &'static str,
pub attr: HashMap<&'static str, String>,
pub children: Vec<VDomNode>,
pub on_click: Option<Rc<dyn Fn()>>,
pub on_input: Option<Rc<dyn Fn(String)>>,
pub on_mouse_enter: Option<Rc<dyn Fn()>>,
pub on_mouse_leave: Option<Rc<dyn Fn()>>,
pub css: Option<Css>,
}
impl VDomElement {
pub fn new(name: &'static str, attr_list: Vec<NodeAttr>, children: Vec<VDomNode>) -> Self {
let mut result = VDomElement {
name,
attr: HashMap::new(),
children,
on_click: None,
on_input: None,
on_mouse_enter: None,
on_mouse_leave: None,
css: None,
};
for child in attr_list {
match child {
NodeAttr::Css { css } => {
result.css = Some(css);
},
NodeAttr::OnClick { event } => {
result.on_click = Some(event);
},
NodeAttr::OnInput { event } => {
result.on_input = Some(event);
},
NodeAttr::OnMouseEnter { event } => {
result.on_mouse_enter = Some(event);
},
NodeAttr::OnMouseLeave { event } => {
result.on_mouse_leave = Some(event);
},
NodeAttr::Attr { name , value} => {
result.attr.insert(name, value);
},
}
}
result
}
}
impl PartialEq for VDomElement {
fn eq(&self, _other: &VDomElement) -> bool {
false
}
}