handbar 0.0.5

Fork of Handlebars.
use serde_json::value::Value as Json;

use crate::context::Context;
use crate::error::RenderError;
use crate::helpers::HelperDef;
use crate::json::value::ScopedJson;
use crate::registry::Registry;
use crate::render::{Helper, RenderContext};

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

impl HelperDef for ReadDirHelper {
    fn call_inner<'reg: 'rc, 'rc>(
        &self,
        h: &Helper<'rc>,
        _: &'reg Registry<'reg>,
        _: &'rc Context,
        _: &mut RenderContext<'reg, 'rc>,
    ) -> Result<ScopedJson<'rc>, RenderError> {
        let path = h
            .param(0)
            .ok_or_else(|| RenderError::new("Param not found for helper \"read_dir\": path"))?
            .value()
            .as_str()
            .ok_or_else(|| {
                RenderError::new("Param invalid for helper \"read_dir\": path must be string")
            })?;

        match std::fs::read_dir(path) {
            Err(err) => Err(RenderError::new(format!(
                "Failed to read dir at helper \"read_dir\": {}",
                err
            ))),
            Ok(entries) => {
                let mut files = Vec::new();

                for entry in entries {
                    if let Ok(entry) = entry {
                        if let Ok(file_name) = entry.file_name().into_string() {
                            files.push(Json::String(file_name));
                        }
                    }
                }

                Ok(Json::Array(files).into())
            }
        }
    }
}

pub static READ_DIR_HELPER: ReadDirHelper = ReadDirHelper;