We close the series by exploring what it means to migrate from CLI to TUI with ratatui: how the interaction model changes, what frictions Rust introduces with ownership and &mut in a persistent event loop, and why hexagonal architecture absorbs the change without surgery.
We design the CLI layer with clap derive, typed argument parsing with ValueEnum and FromStr for UUIDs, subcommands as enums, global –output flag for dual table/json output, and errors propagated through layers down to stderr.
We analyze the repository’s testing strategy: behavior-driven tests for each adapter, isolation with tempdir, why there are no shared tests, and the technical debt we decided to document instead of hide.
Third part of the series: we define the persistence contract with a generic trait, implement two adapters (in-memory and JSON to disk), and delve into the difference between interface and implementation as the axis of hexagonal architecture.
In this part we model the heart of the project: the Task entity, its immutable transitions, and a taxonomy of errors by layers. Less magic, more explicit rules, and fewer surprise bugs.
We kick off the series by building a To-Do CLI in Rust from CodeCrafters’ Project #1, but without turning it into a giant script. We cover architecture decisions, layer boundaries, and why a small project can also teach you serious design.
Reading guide for the Todo CLI in Rust series, featuring the repository’s technical map, recommended reading order, and direct links to files and commits to follow each decision step by step.
A practical guide to setting up a clean and reproducible environment with Docker, Jupyter, and RustRover to work with Sail, whether as a user or contributor. From launching services with docker-compose to debugging locally without installing any dependencies on your machine.