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
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 + 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.render())
            .map(|node| node.get_html())
            .collect();
        format!("{view} {popover}", view = root_node.get_html(), popover = popovers_html.join(""))
    }
}

clone_trait_object!(Renderable);

impl Renderable for Box<dyn Renderable> {
    fn render(&self) -> Node {
        self.deref().render()
    }
}