diff --git a/src/bin.rs b/src/bin.rs index 2be43c0..334559a 100644 --- a/src/bin.rs +++ b/src/bin.rs @@ -3,6 +3,7 @@ extern crate nom; use renderer::compile_template; use renderer::CompiledTemplate; use renderer::DustRenderer; +use renderer::Renderable; use std::env; use std::fs; use std::io::{self, Read}; @@ -65,3 +66,9 @@ fn read_context_from_stdin() -> serde_json::map::Map _ => panic!("Expected context to be an object"), } } + +impl Renderable for serde_json::Value { + fn render(&self) -> String { + self.to_string() + } +} diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index bf55b2e..6f91eb7 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -1,8 +1,10 @@ //! This module contains a renderer for a rust implementation of LinkedIn Dust mod errors; +mod renderable; mod renderer; +pub use renderable::Renderable; pub use renderer::compile_template; pub use renderer::CompiledTemplate; pub use renderer::DustRenderer; diff --git a/src/renderer/renderable.rs b/src/renderer/renderable.rs new file mode 100644 index 0000000..8451c14 --- /dev/null +++ b/src/renderer/renderable.rs @@ -0,0 +1,3 @@ +pub trait Renderable { + fn render(&self) -> String; +} diff --git a/src/renderer/renderer.rs b/src/renderer/renderer.rs index 697b1a8..99f3aba 100644 --- a/src/renderer/renderer.rs +++ b/src/renderer/renderer.rs @@ -4,6 +4,7 @@ use crate::parser::Template; use crate::parser::TemplateElement; use crate::renderer::errors::CompileError; use crate::renderer::errors::RenderError; +use crate::renderer::renderable::Renderable; use std::collections::HashMap; use std::ops::Index; @@ -46,7 +47,7 @@ impl<'a> DustRenderer<'a> { pub fn render(&self, name: &str, context: &C) -> Result where C: Index<&'a str>, - >::Output: std::string::ToString, + >::Output: Renderable, { let main_template = match self.templates.get(name) { Some(tmpl) => tmpl, @@ -62,7 +63,7 @@ impl<'a> DustRenderer<'a> { fn render_template(&self, template: &Template, context: &C) -> Result where C: Index<&'a str>, - >::Output: std::string::ToString, + >::Output: Renderable, { let mut output = String::new(); for elem in &template.contents.elements { @@ -79,13 +80,13 @@ impl<'a> DustRenderer<'a> { fn render_tag(&self, tag: &DustTag, context: &C) -> Result where C: Index<&'a str>, - >::Output: std::string::ToString, + >::Output: Renderable, { match tag { DustTag::DTComment(comment) => (), DustTag::DTReference(reference) => { let val = context.index("name"); - return Ok(val.to_string()); + return Ok(val.render()); } _ => (), // TODO: Implement the rest }