Skip to content
docsv0.19.0

SurfaceProjector

The contract a surface projector implements — the seam that stabilizes the wave's later surfaces (web SchemaForm, TUI, pluggable channels). A projector materializes an {@see Operation} into one surface's native shape. Cada superficie produce un modelo distinto —flags, rutas, herramientas— pero TODAS producen un modelo: eso es lo que fija {@see self::project()}, y lo que este contrato antes declinaba fijar.

SurfaceProjector::surface()

abstract public function surface(): string

The surface this projector targets, e.g. `cli`, `mcp`, `http`.

SurfaceProjector::supports()

abstract public function supports(Milpa\Command\Operation $op): bool

Whether the operation opts into this projector's surface.

Parameters

Parameters of supports()
NameTypeDescription
$opMilpa\Command\Operation

SurfaceProjector::project()

abstract public function project(Milpa\Command\Operation $op): Milpa\Command\SurfaceModel

Proyecta la operación al modelo de esta superficie. Devuelve un valor y no toca nada: no ejecuta, no registra, no responde. Materializar ese modelo —correrlo, montarlo en un registry, pintarlo— es de otra pieza, y esa separación es lo que permite cambiar el renderer de una superficie sin tocar su projector. Este método NO existía, y su ausencia no era un olvido: el contrato decía que el método de proyección era «específico de cada superficie» y por eso sólo fijaba `surface()` y `supports()`. El resultado fue que las tres implementaciones hicieran cosas distintas e incompatibles — una ejecutaba y devolvía un código de salida, otra atendía peticiones HTTP, la tercera mutaba un registry y devolvía `void`. Nombrarlo es la cláusula 3 de ADR-0035.

Parameters

Parameters of project()
NameTypeDescription
$opMilpa\Command\Operation