use serde_json::Value;
use std::collections::HashMap;
use tera::TeraResult;
use crate::template::engine_adapter::JsonRegisterExt;
use crate::path_util::expand_tilde;
pub(super) fn register(tera: &mut tera::Tera) {
tera.register_json_function(
"envOrDefault",
|args: &HashMap<String, Value>| -> TeraResult<Value> {
let name = args
.get("name")
.and_then(|v| v.as_str())
.ok_or_else(|| tera::Error::message("envOrDefault requires `name` argument"))?;
let default = args.get("default").and_then(|v| v.as_str()).unwrap_or("");
let value = std::env::var(name).unwrap_or_else(|_| default.to_string());
Ok(Value::String(value))
},
);
tera.register_json_function(
"isEnvSet",
|args: &HashMap<String, Value>| -> TeraResult<Value> {
let name = args
.get("name")
.and_then(|v| v.as_str())
.ok_or_else(|| tera::Error::message("isEnvSet requires `name` argument"))?;
let is_set = std::env::var(name).map(|v| !v.is_empty()).unwrap_or(false);
Ok(Value::Bool(is_set))
},
);
tera.register_json_function(
"readFile",
|args: &HashMap<String, Value>| -> TeraResult<Value> {
let path = args
.get("path")
.and_then(|v| v.as_str())
.ok_or_else(|| tera::Error::message("readFile requires `path` argument"))?;
let resolved = expand_tilde(path);
let content = std::fs::read_to_string(resolved.as_ref()).unwrap_or_default();
Ok(Value::String(content.trim().to_string()))
},
);
tera.register_json_function(
"mustReadFile",
|args: &HashMap<String, Value>| -> TeraResult<Value> {
let path = args
.get("path")
.and_then(|v| v.as_str())
.ok_or_else(|| tera::Error::message("mustReadFile requires `path` argument"))?;
let resolved = expand_tilde(path);
let content = std::fs::read_to_string(resolved.as_ref())
.map_err(|e| tera::Error::message(format!("mustReadFile: {}: {}", resolved, e)))?;
Ok(Value::String(content.trim().to_string()))
},
);
}