Files
fn_registry/python/functions/infra/codegen_app_modules.md

2.7 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, example, file_path, params, output
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports example file_path params output
codegen_app_modules function py infra 1.0.0 impure generate(app_md: Path, modules_root: Path, app_name: str, out_path: Path) -> int Reads app.md uses_modules + modules/<name>/module.md frontmatters, emits <app>_modules_generated.cpp with fn::app_modules_array[] + fn::app_modules_count. CMake hook for add_imgui_app. Pure YAML parsing, no registry.db dep.
codegen
modules
cmake
cpp
build
false error_go_core
yaml
python python/functions/infra/codegen_app_modules.py \ --app-md apps/data_factory/app.md \ --modules-root modules \ --app-name data_factory \ --out cpp/build/apps/data_factory/data_factory_modules_generated.cpp python/functions/infra/codegen_app_modules.py
name desc
app_md Path absoluto al app.md de la app consumidora. Lee uses_modules del frontmatter YAML.
name desc
modules_root Raiz del directorio modules/. Cada modulo es modules/<name>/module.md.
name desc
app_name Nombre de la app (solo para el comment-header del .cpp generado).
name desc
out_path Path donde escribir el .cpp generado. Idempotente: skip si contenido coincide.
Exit code: 0 si OK, 2 si OK pero algun modulo declarado no existe (warning), >0 si error.

Ejemplo

Generar el .cpp para data_factory:

python python/functions/infra/codegen_app_modules.py \
  --app-md apps/data_factory/app.md \
  --modules-root modules \
  --app-name data_factory \
  --out /tmp/data_factory_modules_generated.cpp

Si data_factory/app.md declara uses_modules: [data_table_cpp], el .cpp generado es:

// Auto-generated by codegen_app_modules.py — do not edit.
// App: data_factory
// Source of truth: apps/data_factory/app.md (uses_modules)

#include "app_modules.h"

namespace fn {
const ModuleInfo app_modules_array[] = {
    { "data_table", "1.4.0", "Reusable C++ ImGui module..." },
};
const unsigned long app_modules_count = 1;
} // namespace fn

Cuando usarla

CMake hook automatico — la macro add_imgui_app la invoca al configurar el build. Apps no la llaman manualmente. Manual override: solo si quieres regenerar fuera del flujo cmake (debugging).

Gotchas

  • Resuelve <name>_cpp strippeando el sufijo _cpp/_py/_ts/_bash/_go. Mismo patron que GenerateModuleID.
  • Si un modulo declarado en uses_modules no existe, emite warning a stderr y EXIT=2 (no falla el build).
  • Idempotente: solo reescribe si el contenido cambia. Evita rebuilds innecesarios cuando los modulos no cambiaron.
  • Requiere pyyaml. Disponible en python/.venv del registry.