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;