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
//! Block helper that sets the scope.
use crate::{
    helper::{Helper, HelperValue},
    parser::ast::Node,
    render::{Context, Render, Scope},
};

pub struct With;

impl Helper for With {
    fn call<'render, 'call>(
        &self,
        rc: &mut Render<'render>,
        ctx: &Context<'call>,
        template: Option<&'render Node<'render>>,
    ) -> HelperValue {
        ctx.arity(1..1)?;

        if let Some(template) = template {
            rc.push_scope(Scope::new());
            if let Some(ref mut scope) = rc.scope_mut() {
                scope.set_base_value(ctx.get(0).cloned().unwrap());
            }
            rc.template(template)?;
            rc.pop_scope();
        }

        Ok(None)
    }
}