pub(crate) mod elements; pub(crate) trait Render { fn render(&self) -> String; } pub(crate) struct Page { title: String, head: Vec>, body: Vec>, } pub(crate) struct PageBuilder { title: Option, head: Option>> body: Option>> } impl PageBuilder { pub(crate) fn new() -> Self { Self { title: None, head: None, body: None, } } pub(crate) fn title(mut self, title: T) where T: Into { self.title = Some(title.into()); } } 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 builder() -> PageBuilder { PageBuilder::new() } pub(crate) fn new(title: T) -> Self where T: Into, { Page { title: title.into(), 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)); } }