chord-flow 0.1.21

async parallel case executor
Documentation
use std::fs::canonicalize;
use std::fs::read_to_string;
use std::path::PathBuf;

use handlebars::{Context, Handlebars, Helper, HelperDef, RenderContext, RenderError, ScopedJson};

use chord_core::value::Value;

pub static READ: ReadHelper = ReadHelper {};
pub static PATH: PathHelper = PathHelper {};

#[derive(Clone, Copy)]
pub struct ReadHelper;

impl HelperDef for ReadHelper {
    fn call_inner<'reg: 'rc, 'rc>(
        &self,
        h: &Helper<'reg, 'rc>,
        _: &'reg Handlebars<'reg>,
        ctx: &'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 \"fs_read\""))?;

        let param = param.value();

        match param {
            Value::String(x) => {
                let task_dir = ctx.data()["__meta__"]["task_dir"]
                    .as_str()
                    .ok_or_else(|| RenderError::new("Param invalid for helper \"fs_read\""))?;
                let mut file_path = PathBuf::from(task_dir);
                file_path.push(x);
                file_path = canonicalize(file_path.as_path())
                    .map_err(|_| RenderError::new("Param invalid for helper \"fs_read\""))?;
                let file_string = read_to_string(file_path).map_err(|e| {
                    RenderError::new(format!("Failed for helper \"fs_read\", cause {}", e))
                })?;
                Ok(ScopedJson::Derived(Value::String(file_string)))
            }
            _ => Err(RenderError::new("Param invalid for helper \"fs_read\"")),
        }
    }
}

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

impl HelperDef for PathHelper {
    fn call_inner<'reg: 'rc, 'rc>(
        &self,
        h: &Helper<'reg, 'rc>,
        _: &'reg Handlebars<'reg>,
        ctx: &'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 \"fs_path\""))?;

        let param = param.value();

        match param {
            Value::String(x) => {
                let task_dir = ctx.data()["__meta__"]["task_dir"]
                    .as_str()
                    .ok_or_else(|| RenderError::new("Param invalid for helper \"fs_path\""))?;
                let mut file_path = PathBuf::from(task_dir);
                file_path.push(x);
                file_path = canonicalize(file_path.as_path())
                    .map_err(|_| RenderError::new("Param invalid for helper \"fs_path\""))?;
                let path_string = file_path
                    .to_str()
                    .ok_or_else(|| RenderError::new("Failed for helper \"fs_path\""))?;
                Ok(ScopedJson::Derived(Value::String(path_string.to_string())))
            }
            _ => Err(RenderError::new("Param invalid for helper \"fs_path\"")),
        }
    }
}