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
use std::fmt::Debug;
use std::collections::HashMap;
use grass;
use crate::node::Node;
use std::ops::Deref;
use dyn_clone::{DynClone, clone_trait_object};
pub trait Renderable: DynClone + Send + Sync + Debug {
fn render(&self) -> Node;
fn to_html(&self) -> String {
let root_node: Node = self.render();
let popovers_html: Vec<String> = root_node.get_popovers().iter()
.map(|popover| popover.to_html())
.collect();
let popups_html: Vec<String> = root_node.get_popups().iter()
.map(|popup| popup.to_html())
.collect();
format!(
"{view} {popover} {popup}",
view = root_node.get_html(),
popover = popovers_html.join(""),
popup = popups_html.join("")
)
}
}
clone_trait_object!(Renderable);
impl Renderable for Box<dyn Renderable> {
fn render(&self) -> Node {
self.deref().render()
}
}