feat(brahman-cards): templates Nickel canónicos para cada body kind

Materializa el patrón "import + override" del brazo. Hasta ahora
BRAHMAN_CARDS_TEMPLATES_DIR existía como mecanismo pero el repo no
shippeaba ningún template.

3 templates basic bajo crates/core/brahman-cards/templates/:
- ente_basic.ncl: Card runtime mínima (Virtual + OneShot).
- monad_basic.ncl: Mónada con metadata vacía.
- ui_module_basic.ncl: descriptor UI con entities/menu/views vacíos.

Cada field override-able marcada `| default` (sin eso Nickel rebota
merge de strings/numbers no-iguales).

Nuevo `pub fn canonical_templates_dir() -> PathBuf` resuelve el dir
via CARGO_MANIFEST_DIR. Para distribución del binary standalone
queda como pending (include_dir! o convención de install path).

5 tests E2E que cubren los 3 templates con import+override, sanity
del default sin override, y existencia física del dir.

Tests brahman-cards: 26 → 31 (+5). Workspace intacto.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sergio
2026-05-10 09:30:16 +00:00
parent b05de24c24
commit df089f0585
6 changed files with 420 additions and 1 deletions
+19 -1
View File
@@ -41,7 +41,7 @@
#![forbid(unsafe_code)]
use std::collections::BTreeMap;
use std::path::Path;
use std::path::{Path, PathBuf};
use serde::{Deserialize, Serialize};
use serde_json::Value;
@@ -188,6 +188,24 @@ mod readers;
pub use nickel_eval::{eval_nickel_file, NickelEvalError, BRAHMAN_CARDS_TEMPLATES_ENV};
pub use readers::{EnteJsonReader, MonadJsonReader, UiModuleJsonReader};
/// Path al directorio de templates Nickel canónicos shipped con el
/// crate (`crates/core/brahman-cards/templates/` en el repo).
///
/// Este directorio contiene los `*_basic.ncl` para cada body kind:
/// - `ente_basic.ncl`
/// - `monad_basic.ncl`
/// - `ui_module_basic.ncl`
///
/// Usar como path para [`BRAHMAN_CARDS_TEMPLATES_ENV`] o pasarlo
/// directo a Nickel via env. Resuelto via `CARGO_MANIFEST_DIR` —
/// funciona en `cargo test`/`cargo run` desde el workspace. Para
/// distribución del binary standalone (cuando emerja el caso de
/// uso), incluir los templates como recursos via `include_dir!` o
/// instalar el directorio junto al ejecutable.
pub fn canonical_templates_dir() -> PathBuf {
PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("templates")
}
/// Construye el set default de readers para inputs JSON. El orden
/// es deliberado: el más específico (UiModule, que tiene `entities`
/// y `views` simultáneamente) antes que el más laxo. Si dos readers