chord-flow 0.1.21

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

pub static JSON: JsonHelper = JsonHelper {};
pub static PATH: PathHelper = PathHelper {};

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

impl HelperDef for JsonHelper {
    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 \"json\""))?;

        Ok(ScopedJson::Derived(param.value().clone()))
    }
}

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

impl HelperDef for PathHelper {
    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 params = h.params();
        if params.len() != 2 {
            return Err(RenderError::new("Param invalid for helper \"json_path\""));
        }

        let value = params[0].value();

        let path = params[1]
            .value()
            .as_str()
            .ok_or(RenderError::new("Param invalid for helper \"json_path\""))?;

        let mut finder = JsonPathFinder::from_str("null", path).map_err(|e| {
            RenderError::new(format!("Param invalid for helper \"json_path\": {}", e))
        })?;
        finder.set_json(Box::new(value.clone()));

        let find = finder.find();
        Ok(ScopedJson::Derived(find))
    }
}