use crate::api::Database;
use minijinja::{Environment, Error as JinjaError, ErrorKind};
use std::sync::Arc;
pub fn db_template_loader(name: &str, db: Arc<Database>) -> Result<Option<String>, JinjaError> {
let query = "SELECT content FROM templates.source WHERE name = ?";
let rows_result = db
.query(query, vec![crate::Value::text(name)])
.map_err(|e| {
JinjaError::new(
ErrorKind::TemplateNotFound,
format!("Database error fetching template: {}", e),
)
})?;
let mut rows = vec![];
for r in rows_result.flatten() {
rows.push(r);
}
if rows.is_empty() {
return Ok(None);
}
let content_val = rows[0]
.get_value(0)
.cloned()
.unwrap_or(crate::Value::null_unknown());
if let crate::Value::Text(s) = content_val {
Ok(Some(s.to_string()))
} else {
Ok(None)
}
}
pub fn create_env(db: Arc<Database>) -> Environment<'static> {
let mut env = Environment::new();
let db_clone = db.clone();
env.set_loader(move |name| db_template_loader(name, db_clone.clone()));
env
}