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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
use crate::context::Context; use crate::decorators::{DecoratorDef, DecoratorResult}; use crate::error::RenderError; use crate::registry::Registry; use crate::render::{Decorator, RenderContext}; #[derive(Clone, Copy)] pub struct InlineDecorator; fn get_name<'reg: 'rc, 'rc>(d: &'rc Decorator<'reg, 'rc>) -> Result<&'rc str, RenderError> { d.param(0) .ok_or_else(|| RenderError::new("Param required for decorator \"inline\"")) .and_then(|v| { v.value() .as_str() .ok_or_else(|| RenderError::new("inline name must be string")) }) } impl DecoratorDef for InlineDecorator { fn call<'reg: 'rc, 'rc>( &self, d: &Decorator<'reg, 'rc>, _: &'reg Registry<'reg>, _: &'rc Context, rc: &mut RenderContext<'reg, 'rc>, ) -> DecoratorResult { let name = get_name(d)?; let template = d .template() .ok_or_else(|| RenderError::new("inline should have a block"))?; rc.set_partial(name.to_owned(), template); Ok(()) } } pub static INLINE_DECORATOR: InlineDecorator = InlineDecorator; #[cfg(test)] mod test { use crate::context::Context; use crate::registry::Registry; use crate::render::{Evaluable, RenderContext}; use crate::template::Template; #[test] fn test_inline() { let t0 = Template::compile( "{{#*inline \"hello\"}}the hello world inline partial.{{/inline}}".to_string(), ) .ok() .unwrap(); let hbs = Registry::new(); let ctx = Context::null(); let mut rc = RenderContext::new(None); t0.elements[0].eval(&hbs, &ctx, &mut rc).unwrap(); assert!(rc.get_partial(&"hello".to_owned()).is_some()); } }