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()
    }
}