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
use Renderable; use context::Context; use filters::{size, upcase, minus, replace}; use error::Result; pub struct Template<'a> { pub elements: Vec<Box<Renderable + 'a>>, } impl<'a> Renderable for Template<'a> { fn render(&self, context: &mut Context) -> Result<Option<String>> { context.filters.insert("size".to_string(), Box::new(size)); context.filters.insert("upcase".to_string(), Box::new(upcase)); context.filters.insert("minus".to_string(), Box::new(minus)); context.filters.insert("replace".to_string(), Box::new(replace)); let mut buf = String::new(); for el in self.elements.iter() { if let Some(ref x) = try!(el.render(context)) { buf = buf + x; } } Ok(Some(buf)) } } impl<'a> Template<'a> { pub fn new(elements: Vec<Box<Renderable + 'a>>) -> Template<'a> { Template { elements: elements } } }