ADR-0019 §9 sweep (2/2): help blocks + modals + system notes
Final pass of the i18n migration sweep. Every user-visible
string in `src/` now flows through the catalog via `t!()`.
## Categories migrated in this commit
- **help.cli_banner** — the entire `cli::HELP_TEXT` const,
formerly a 40-line `&'static str`, is now a YAML block in
the catalog. The const is replaced by a thin
`cli::help_text() -> String` wrapper that performs the
catalog lookup. `main.rs` calls `help_text()` for both
`--help` output and the args-parse error path. The two
integration tests that referenced `HELP_TEXT` directly are
updated.
- **help.in_app_body** — the in-app `help` command's body is
one YAML block; `note_help` becomes 5 lines that iterate
the lines and emit each as its own output row (preserving
the renderer's "one logical line = one display row"
invariant for accurate scroll math).
- **modal.*** — load picker, rebuild confirm, and save-as
path-entry strings: rebuild_cancelled, load_cancelled,
generic_cancelled, load_picker_nothing,
path_entry_empty_name, path_entry_empty_path.
- **dsl.failed** — the `"<verb> <subject>" failed: <rendered>`
wrapper around the friendly-error layer's translated
message.
- **dsl.running** — the `running: <input>` echo line shown
above each command's response. (Note: the en-US prefix
"running: " is hardcoded in the parse-error caret-padding
calculation. Translators changing the prefix must keep the
width consistent — documented inline.)
- **advanced_mode.not_implemented** — the placeholder echo
shown when SQL hits the unimplemented advanced-mode path
(Q1 territory).
- **fatal.persistence** — the FATAL banner for
PersistenceFatal events (ADR-0015 §8).
- **project.{load_path_missing,saveas_target_exists,**
**import_zip_missing}** — runtime-side project-switch
validation errors that surface via ProjectSwitchFailed.
## Catalog start-up ordering
`main.rs` now calls `friendly::catalog()` at the very top
(before args parsing) so `help_text()` works in both the
success path and the args-error path. A corrupted build
artefact still fails loudly with a useful panic; the
practical risk is essentially zero since the catalog is
`include_str!`'d at compile time and validated by the unit
test before shipping.
## Remaining literals
The only `note_*` calls in `src/` that still pass plain
strings are inside `#[cfg(test)]` modules — synthetic test
fixtures, not user-visible. The codebase passes the "every
user-visible string flows through the catalog" bar.
## Tally
610 tests passing (no change in count — pure refactor).
Clippy clean with nursery lints.
## What this closes
ADR-0019 §9 (migration sweep) — done.
ADR-0019 itself is now fully implemented:
- §1-§5: catalog + translator + voice + verbosity ✓ (`eac7e5b`)
- §6: row pinpointing + schema enrichment ✓ (`431645a`)
- §9: migration sweep ✓ (this + `aff528a`)
- §10: anchor phrases preserved throughout ✓
- The five "Out of scope" items remain explicitly bounded
to future ADRs (advanced-mode SQL, settings persistence,
pluralisation, runtime locale, value formatting,
constraint management).
This commit is contained in:
+10
-45
@@ -31,51 +31,16 @@ pub struct Args {
|
||||
pub help: bool,
|
||||
}
|
||||
|
||||
/// Usage banner printed by `--help`. Kept as one block so the
|
||||
/// formatting is reviewable on its own.
|
||||
pub const HELP_TEXT: &str = "\
|
||||
rdbms-playground — a TUI playground for relational database concepts
|
||||
|
||||
Usage:
|
||||
rdbms-playground [options] [<project-path>]
|
||||
|
||||
Arguments:
|
||||
<project-path> Path to an existing project directory.
|
||||
Without this, a fresh auto-named temp
|
||||
project is created in the data dir.
|
||||
|
||||
Options:
|
||||
-h, --help Print this help and exit.
|
||||
--theme <light|dark> Override theme (default: auto-detect).
|
||||
--data-dir <PATH> Use PATH as the data root instead of
|
||||
the OS-standard location for this run.
|
||||
--log-file <PATH> Write tracing output to PATH.
|
||||
--resume Open the most-recently-used project
|
||||
(path tracked under <data-root>/last_project).
|
||||
Errors out if no previous project is
|
||||
recorded. Mutually exclusive with
|
||||
<project-path>.
|
||||
|
||||
App-level commands (typed inside the app, available in both modes):
|
||||
quit / q Exit cleanly.
|
||||
mode simple|advanced Switch input mode.
|
||||
help Show this list of commands in-app.
|
||||
save Save the current temp project under a
|
||||
chosen name (or `save as` to copy a
|
||||
named project to a new location).
|
||||
save as Always prompt for a target name/path.
|
||||
new Close current, create a fresh temp.
|
||||
load Open the project picker.
|
||||
rebuild Rebuild playground.db from project.yaml
|
||||
+ data/, with confirmation.
|
||||
export [<path>] Write a zip of project.yaml + data/ to
|
||||
<path> (relative paths under the data
|
||||
root). Excludes playground.db and
|
||||
history.log.
|
||||
import <zip> [as <t>] Unpack <zip> into a new project and
|
||||
switch to it. <t> overrides the target
|
||||
name (else taken from the zip).
|
||||
";
|
||||
/// Usage banner printed by `--help`.
|
||||
///
|
||||
/// Wraps the catalog lookup (`help.cli_banner`) so callers
|
||||
/// don't have to spell out the key. The catalog body is the
|
||||
/// single source of truth — see
|
||||
/// `src/friendly/strings/en-US.yaml`.
|
||||
#[must_use]
|
||||
pub fn help_text() -> String {
|
||||
crate::t!("help.cli_banner")
|
||||
}
|
||||
|
||||
#[derive(Debug, thiserror::Error)]
|
||||
pub enum ArgsError {
|
||||
|
||||
Reference in New Issue
Block a user