use render::{RenderContext, RenderError, Helper};
use registry::Registry;
pub use self::helper_if::{IF_HELPER, UNLESS_HELPER};
pub use self::helper_each::EACH_HELPER;
pub use self::helper_with::WITH_HELPER;
pub use self::helper_lookup::LOOKUP_HELPER;
pub use self::helper_raw::RAW_HELPER;
#[cfg(feature="partial_legacy")]
pub use self::helper_partial::{INCLUDE_HELPER, BLOCK_HELPER, PARTIAL_HELPER};
pub use self::helper_log::LOG_HELPER;
pub trait HelperDef: Send + Sync {
fn call(&self, h: &Helper, r: &Registry, rc: &mut RenderContext) -> Result<(), RenderError>;
}
impl<F: Send + Sync + for<'b, 'c, 'd, 'e> Fn(&'b Helper, &'c Registry, &'d mut RenderContext) -> Result<(), RenderError>> HelperDef for F {
fn call(&self, h: &Helper, r: &Registry, rc: &mut RenderContext) -> Result<(), RenderError>{
(*self)(h, r, rc)
}
}
mod helper_if;
mod helper_each;
mod helper_with;
mod helper_lookup;
mod helper_raw;
#[cfg(feature="partial_legacy")]
mod helper_partial;
mod helper_log;
#[cfg(test)]
mod test {
use std::collections::BTreeMap;
use context::JsonRender;
use helpers::HelperDef;
use registry::Registry;
use render::{RenderContext, RenderError, Renderable, Helper};
#[derive(Clone, Copy)]
struct MetaHelper;
impl HelperDef for MetaHelper {
fn call(&self,
h: &Helper,
r: &Registry,
rc: &mut RenderContext)
-> Result<(), RenderError> {
let v = h.param(0).unwrap();
if !h.is_block() {
let output = format!("{}:{}", h.name(), v.value().render());
try!(rc.writer.write(output.into_bytes().as_ref()));
} else {
let output = format!("{}:{}", h.name(), v.value().render());
try!(rc.writer.write(output.into_bytes().as_ref()));
try!(rc.writer.write("->".as_bytes()));
try!(h.template().unwrap().render(r, rc));
};
Ok(())
}
}
#[test]
fn test_meta_helper() {
let mut handlebars = Registry::new();
assert!(handlebars.register_template_string("t0", "{{foo this}}").is_ok());
assert!(handlebars.register_template_string("t1", "{{#bar this}}nice{{/bar}}").is_ok());
let meta_helper = MetaHelper;
handlebars.register_helper("helperMissing", Box::new(meta_helper));
handlebars.register_helper("blockHelperMissing", Box::new(meta_helper));
let r0 = handlebars.render("t0", &true);
assert_eq!(r0.ok().unwrap(), "foo:true".to_string());
let r1 = handlebars.render("t1", &true);
assert_eq!(r1.ok().unwrap(), "bar:true->nice".to_string());
}
#[test]
fn test_helper_for_subexpression() {
let mut handlebars = Registry::new();
assert!(handlebars.register_template_string("t2", "{{foo value=(bar 0)}}").is_ok());
handlebars.register_helper("helperMissing",
Box::new(|h: &Helper,
_: &Registry,
rc: &mut RenderContext|
-> Result<(), RenderError> {
let output = format!("{}{}",
h.name(),
h.param(0).unwrap().value());
try!(rc.writer.write(output.into_bytes().as_ref()));
Ok(())
}));
handlebars.register_helper("foo",
Box::new(|h: &Helper,
_: &Registry,
rc: &mut RenderContext|
-> Result<(), RenderError> {
let output = format!("{}",
h.hash_get("value")
.unwrap()
.value()
.render());
try!(rc.writer.write(output.into_bytes().as_ref()));
Ok(())
}));
let mut data = BTreeMap::new();
data.insert("bar0".to_string(), true);
let r2 = handlebars.render("t2", &data);
assert_eq!(r2.ok().unwrap(), "bar0".to_string());
}
}