diff options
Diffstat (limited to 'vendor/handlebars-3.5.5/examples/render.rs')
-rw-r--r-- | vendor/handlebars-3.5.5/examples/render.rs | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/vendor/handlebars-3.5.5/examples/render.rs b/vendor/handlebars-3.5.5/examples/render.rs new file mode 100644 index 000000000..112ec504d --- /dev/null +++ b/vendor/handlebars-3.5.5/examples/render.rs @@ -0,0 +1,135 @@ +extern crate env_logger; +extern crate handlebars; + +#[macro_use] +extern crate serde_derive; +extern crate serde_json; + +use serde_json::value::{Map, Value as Json}; +use std::error::Error; + +use handlebars::{ + to_json, Context, Handlebars, Helper, JsonRender, Output, RenderContext, RenderError, +}; + +// define a custom helper +fn format_helper( + h: &Helper, + _: &Handlebars, + _: &Context, + _: &mut RenderContext, + out: &mut dyn Output, +) -> Result<(), RenderError> { + // get parameter from helper or throw an error + let param = h + .param(0) + .ok_or(RenderError::new("Param 0 is required for format helper."))?; + let rendered = format!("{} pts", param.value().render()); + out.write(rendered.as_ref())?; + Ok(()) +} + +// another custom helper +fn rank_helper( + h: &Helper, + _: &Handlebars, + _: &Context, + _: &mut RenderContext, + out: &mut dyn Output, +) -> Result<(), RenderError> { + let rank = h + .param(0) + .and_then(|v| v.value().as_u64()) + .ok_or(RenderError::new( + "Param 0 with u64 type is required for rank helper.", + ))? as usize; + let total = h + .param(1) + .as_ref() + .and_then(|v| v.value().as_array()) + .map(|arr| arr.len()) + .ok_or(RenderError::new( + "Param 1 with array type is required for rank helper", + ))?; + if rank == 0 { + out.write("champion")?; + } else if rank >= total - 2 { + out.write("relegation")?; + } else if rank <= 2 { + out.write("acl")?; + } + Ok(()) +} + +static TYPES: &'static str = "serde_json"; + +// define some data +#[derive(Serialize)] +pub struct Team { + name: String, + pts: u16, +} + +// produce some data +pub fn make_data() -> Map<String, Json> { + let mut data = Map::new(); + + data.insert("year".to_string(), to_json("2015")); + + let teams = vec![ + Team { + name: "Jiangsu Suning".to_string(), + pts: 43u16, + }, + Team { + name: "Shanghai SIPG".to_string(), + pts: 39u16, + }, + Team { + name: "Hebei CFFC".to_string(), + pts: 27u16, + }, + Team { + name: "Guangzhou Evergrand".to_string(), + pts: 22u16, + }, + Team { + name: "Shandong Luneng".to_string(), + pts: 12u16, + }, + Team { + name: "Beijing Guoan".to_string(), + pts: 7u16, + }, + Team { + name: "Hangzhou Greentown".to_string(), + pts: 7u16, + }, + Team { + name: "Shanghai Shenhua".to_string(), + pts: 4u16, + }, + ]; + + data.insert("teams".to_string(), to_json(&teams)); + data.insert("engine".to_string(), to_json(TYPES)); + data +} + +fn main() -> Result<(), Box<dyn Error>> { + env_logger::init(); + // create the handlebars registry + let mut handlebars = Handlebars::new(); + + // register template from a file and assign a name to it + handlebars.register_template_file("table", "./examples/render/template.hbs")?; + + // register some custom helpers + handlebars.register_helper("format", Box::new(format_helper)); + handlebars.register_helper("ranking_label", Box::new(rank_helper)); + + // make data and render it + let data = make_data(); + println!("{}", handlebars.render("table", &data)?); + Ok(()) +} |