feat(cli): clap-based CLI + parse_cli_args() helper (#15) #34
No reviewers
Labels
No labels
area:assertions
area:cli
area:client
area:harness
area:meta
area:reporting
area:runner
type:user-story
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
charles/ws-rpc-test!34
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/15-cli"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #15. Stacked on #33.
Summary
Adds the
climodule behind the default-onclifeature declared in #1. Gives test binaries a one-liner (runner.parse_cli_args()) that wires every spec §7 flag intoRunConfig.Flags (all from spec §7)
--binary <PATH>--host <HOST>(default127.0.0.1)--port <PORT>(default9820)--health-url <URL>--ws-url <URL>--token <TOKEN>--filter <PATTERN>--tag <TAG>--fail-fast--timeout <SECS>(default 60)--format <FORMAT>(defaultconsole;jsonandjunitaccepted)--no-color--startup-timeout <SECS>(default 15)-v / --verbose--parallel--parallel-workers <N>API
Apply rules (
Cli::apply_to(&mut RunConfig))filter/tagonly override whenSome(builder-configured values win if the user didn't pass flags)fail_fast/no_color/parallelonly override whentruetimeoutis always applied (clap default is 60 s, matchesRunConfig::with_defaults)formatgoes throughOutputFormat::parse— invalid values leave the config's format untouched (graceful degrade rather than clap-level error)parallel_workersonly overrides whenSomeChecklist (from issue #15)
Clistruct with clap deriverunner.parse_cli_args()one-liner applies toRunConfig--filter/--tagpopulatefilter/tag--formatis handled cleanly (no panic)--helpline (from clap#[arg]docs)clapgated behind the default-onclifeature — consumers can disable viadefault-features = falseRunConfig, invalid formatTest plan
src/cli.rsjust qagreen locally — 102 unit + 5 integration = 107/107Notes for the reviewer
--binary,--health-url,--ws-url,--token) are parsed into theClistruct but not applied to the harness byparse_cli_args. Consumers own theProcessHarness::builder()chain and should set those fields there. The issue's §9 example applies them manually viaProcessHarness::builder().command(cli.binary.unwrap_or("target/debug/my-app")).... We can add a convenience helper later.RunConfig::timeoutis overwritten unconditionally because clap's default (60 s) already matcheswith_defaults. If a user callsrunner.timeout(Duration::from_secs(30))beforeparse_cli_args(), their builder value will be overwritten when the CLI uses the default 60. I weighed making thisOption<u64>to preserve the builder value, but "CLI wins" is the simpler mental model and matches how most tools behave.clifeature is on by default. Consumers who want to useclap-less builds can opt out viadefault-features = falsein theirCargo.toml.Cli::try_parse_from(["ws-rpc-test", ...])so they don't readstd::env::args. No process state is leaked.Review PR #34 — CLI clap
Feature propre et bien délimitée. L'intégration derrière le feature flag
cliest correcte, les tests couvrent bien les cas prévus. Un point mérite attention.🐛 Bug de priorité :
timeoutécrase toujours la valeur du runner--timeoutadefault_value_t = 60dans clap. Cela signifie queself.timeoutvaut toujours 60 — que l'utilisateur ait passé--timeoutou non. En conséquence,apply_to()écrase systématiquement le timeout configuré dans le runner, même si l'appelant avait positionnéconfig.timeout = Duration::from_secs(300)avant d'appelerparse_cli_args().Le commentaire de la méthode dit : "Only fields set by the user (Some / non-default) override the runner's defaults", mais ce n'est pas vrai pour
timeout: la valeur par défaut de clap écrase la valeur programmatique.Fix minimal — utiliser un
Option<u64>dans le struct :Même traitement conseillé pour
startup_timeout.Champs exposés mais non appliqués par
apply_to()binary,host,port,health_url,ws_url,token,startup_timeout,verbosesont parsés mais pas appliqués. Le doc-comment deparse_cli_args()l'explique (les champs harness appartiennent auHarnessBuilder), c'est un choix de design valide. Maisverboseetstartup_timeoutne correspondent pas à des champs harness — s'ils ne font rien pour l'instant, un commentaire// TODO: wire into RunConfig once the field existséviterait la confusion.Format invalide silencieux
--format xml-v2est accepté par clap mais ignoré silencieusement. La valeur resteConsole. Le testcli_invalid_format_leaves_config_unchangedvalide ce comportement. Une mise en garde sureprintln!améliorerait l'UX, mais ce n'est pas un bug.Points positifs
#[cfg(feature = "cli")]correctement propagée danslib.rs,runner.rs, et les exemples.apply_to()correctement one-directional pour les booléens (on peut activerfail_fastvia CLI, pas le désactiver).parse_cli_args()retourne&mut Self→ chaînable. ✓⚠️ Le bug
timeout(écrasement systématique par la valeur par défaut clap 60 s) peut causer des surprises si le runner est configuré avec un timeout plus long. À corriger avant merge.ddcc81958ctoa7ce5b44fe