pub(crate) mod elements; pub(crate) trait Render { fn render(&self) -> String; } pub(crate) struct Page { title: String, head: Vec>, body: Vec>, } impl Render for Vec> { fn render(&self) -> String { let mut result = String::new(); for element in self { let render = element.render(); result.push_str(&render); } result } } impl Render for Page { fn render(&self) -> String { format!( "\ {} {} {} ", self.title, self.head.render(), self.body.render() ) } } impl Page { pub(crate) fn new(title: String) -> Self { Page { title, head: vec![], body: vec![], } } pub(crate) fn append_element_to_body(&mut self, element: impl Render + 'static) { self.body.push(Box::new(element)); } pub(crate) fn append_element_to_head(&mut self, element: impl Render + 'static) { self.head.push(Box::new(element)); } }