chord-flow 0.1.21

async parallel case executor
Documentation
use handlebars::handlebars_helper;
use handlebars::{Context, Handlebars, Helper, HelperDef, RenderContext, RenderError, ScopedJson};

use chord_core::value::{from_str, Value};

handlebars_helper!(OBJ_CONTAINS_KEY: |x: Json, y: Json|{
    x.is_object() && y.is_string() && x.as_object().unwrap().contains_key(y.as_str().unwrap())
});

pub static OBJ: ObjHelper = ObjHelper {};

#[derive(Clone, Copy)]
pub struct ObjHelper {}

impl HelperDef for ObjHelper {
    fn call_inner<'reg: 'rc, 'rc>(
        &self,
        h: &Helper<'reg, 'rc>,
        _: &'reg Handlebars<'reg>,
        _: &'rc Context,
        _: &mut RenderContext<'reg, 'rc>,
    ) -> Result<ScopedJson<'reg, 'rc>, RenderError> {
        let param = h
            .param(0)
            .ok_or_else(|| RenderError::new("Param not found for helper \"obj\""))?;

        match param.value() {
            Value::String(txt) => Ok(ScopedJson::Derived(Value::Object(from_str(txt)?))),
            Value::Object(obj) => Ok(ScopedJson::Derived(Value::Object(obj.clone()))),
            _ => Err(RenderError::new("\"obj\" can not convert ")),
        }
    }
}

#[derive(Clone, Copy)]
pub struct ObjContainsKeyHelper {}

impl HelperDef for ObjContainsKeyHelper {
    fn call_inner<'reg: 'rc, 'rc>(
        &self,
        h: &Helper<'reg, 'rc>,
        _: &'reg Handlebars<'reg>,
        _: &'rc Context,
        _: &mut RenderContext<'reg, 'rc>,
    ) -> Result<ScopedJson<'reg, 'rc>, RenderError> {
        let obj = h
            .param(0)
            .ok_or_else(|| RenderError::new("Param not found for helper \"obj_contains_key\""))?;

        let key = h
            .param(1)
            .ok_or_else(|| RenderError::new("Param not found for helper \"obj_contains_key\""))?;

        match obj.value() {
            Value::Object(obj) => match key.value() {
                Value::String(s) => Ok(ScopedJson::Derived(Value::Bool(obj.contains_key(s)))),
                _ => Err(RenderError::new(
                    "Param invalid for helper \"obj_contains_key\"",
                )),
            },
            _ => Err(RenderError::new(
                "Param invalid for helper \"obj_contains_key\"",
            )),
        }
    }
}