Initial implementation of custom Renderable trait.

This commit is contained in:
Tom Alexander 2020-04-11 19:11:14 -04:00
parent af5122ab9f
commit e26b158ab4
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE
4 changed files with 17 additions and 4 deletions

View File

@ -3,6 +3,7 @@ extern crate nom;
use renderer::compile_template; use renderer::compile_template;
use renderer::CompiledTemplate; use renderer::CompiledTemplate;
use renderer::DustRenderer; use renderer::DustRenderer;
use renderer::Renderable;
use std::env; use std::env;
use std::fs; use std::fs;
use std::io::{self, Read}; use std::io::{self, Read};
@ -65,3 +66,9 @@ fn read_context_from_stdin() -> serde_json::map::Map<String, serde_json::Value>
_ => panic!("Expected context to be an object"), _ => panic!("Expected context to be an object"),
} }
} }
impl Renderable for serde_json::Value {
fn render(&self) -> String {
self.to_string()
}
}

View File

@ -1,8 +1,10 @@
//! This module contains a renderer for a rust implementation of LinkedIn Dust //! This module contains a renderer for a rust implementation of LinkedIn Dust
mod errors; mod errors;
mod renderable;
mod renderer; mod renderer;
pub use renderable::Renderable;
pub use renderer::compile_template; pub use renderer::compile_template;
pub use renderer::CompiledTemplate; pub use renderer::CompiledTemplate;
pub use renderer::DustRenderer; pub use renderer::DustRenderer;

View File

@ -0,0 +1,3 @@
pub trait Renderable {
fn render(&self) -> String;
}

View File

@ -4,6 +4,7 @@ use crate::parser::Template;
use crate::parser::TemplateElement; use crate::parser::TemplateElement;
use crate::renderer::errors::CompileError; use crate::renderer::errors::CompileError;
use crate::renderer::errors::RenderError; use crate::renderer::errors::RenderError;
use crate::renderer::renderable::Renderable;
use std::collections::HashMap; use std::collections::HashMap;
use std::ops::Index; use std::ops::Index;
@ -46,7 +47,7 @@ impl<'a> DustRenderer<'a> {
pub fn render<C>(&self, name: &str, context: &C) -> Result<String, RenderError> pub fn render<C>(&self, name: &str, context: &C) -> Result<String, RenderError>
where where
C: Index<&'a str>, C: Index<&'a str>,
<C as std::ops::Index<&'a str>>::Output: std::string::ToString, <C as std::ops::Index<&'a str>>::Output: Renderable,
{ {
let main_template = match self.templates.get(name) { let main_template = match self.templates.get(name) {
Some(tmpl) => tmpl, Some(tmpl) => tmpl,
@ -62,7 +63,7 @@ impl<'a> DustRenderer<'a> {
fn render_template<C>(&self, template: &Template, context: &C) -> Result<String, RenderError> fn render_template<C>(&self, template: &Template, context: &C) -> Result<String, RenderError>
where where
C: Index<&'a str>, C: Index<&'a str>,
<C as std::ops::Index<&'a str>>::Output: std::string::ToString, <C as std::ops::Index<&'a str>>::Output: Renderable,
{ {
let mut output = String::new(); let mut output = String::new();
for elem in &template.contents.elements { for elem in &template.contents.elements {
@ -79,13 +80,13 @@ impl<'a> DustRenderer<'a> {
fn render_tag<C>(&self, tag: &DustTag, context: &C) -> Result<String, RenderError> fn render_tag<C>(&self, tag: &DustTag, context: &C) -> Result<String, RenderError>
where where
C: Index<&'a str>, C: Index<&'a str>,
<C as std::ops::Index<&'a str>>::Output: std::string::ToString, <C as std::ops::Index<&'a str>>::Output: Renderable,
{ {
match tag { match tag {
DustTag::DTComment(comment) => (), DustTag::DTComment(comment) => (),
DustTag::DTReference(reference) => { DustTag::DTReference(reference) => {
let val = context.index("name"); let val = context.index("name");
return Ok(val.to_string()); return Ok(val.render());
} }
_ => (), // TODO: Implement the rest _ => (), // TODO: Implement the rest
} }