La rata empieza a pintar. Implementamos la capa de renderizado: dibujo en modo inmediato, un layout de tres zonas con Layout::vertical, una tabla de tareas con StatefulWidget y resaltado de fila, una barra de comandos sensible al contexto que cambia según InputMode, y el sutil gotcha de Block que costó unos minutos de depuración.
Arrancamos una nueva serie migrando el adaptador CLI a una TUI con ratatui. Configuramos las nuevas dependencias, diseñamos la estructura de módulos bajo adapters/tui/, modelamos los modos de interacción como un enum para hacer los estados inválidos irrepresentables, y resolvemos el puzzle de ownership al clonar un repositorio en una sesión persistente.
Guia practica para conectar OpenCode con el servidor remoto de GitHub MCP usando PAT, desactivar OAuth automatico y evitar los errores de autenticacion mas comunes.
Agregar un nuevo tipo es facil en OOP, dificil en FP. Agregar una nueva operacion es facil en FP, dificil en OOP. Philip Wadler nombro esto el Expression Problem en 1998. Mostramos como se manifiesta en Rust y Scala, y anticipamos la resolucion.
Tu expresion match es semantica operacional. Tu funcion pura es semantica denotacional. El borrow checker de Rust es semantica axiomatica. Tres marcos formales, tres formas de asignar significado al codigo, y has estado usando los tres sin saberlo.
Cada enum que escribes es una gramatica formal. Cada sealed trait es un conjunto de reglas de produccion. Has estado haciendo metodos formales todo este tiempo; simplemente no sabias el nombre. Trazamos la conexion desde la jerarquia de Chomsky hasta tus tipos de dominio en Rust y Scala.
Al volver sobre el trait TaskRepository de la serie Todo CLI, me di cuenta de que no solo estaba dibujando una frontera arquitectónica. También estaba definiendo qué podía decirse en esa frontera, y eso se parece mucho más a una gramática de lo que pensé al principio.
Cerramos la serie explorando qué implica migrar de CLI a TUI con ratatui: cómo cambia el modelo de interacción, qué fricciones introduce Rust con ownership y &mut en un event loop persistente, y por qué la arquitectura hexagonal absorbe el cambio sin cirugía.