Skip to main content

grex_cli/cli/
mod.rs

1pub mod args;
2pub mod deprecation;
3pub mod verbs;
4
5use anyhow::Result;
6use args::{Cli, Verb};
7use tokio_util::sync::CancellationToken;
8
9pub fn run(cli: Cli) -> Result<()> {
10    // feat-m7-1 stage 2: every verb accepts `&CancellationToken` as its
11    // final argument. The CLI is a single-shot, foreground process that
12    // has no out-of-band cancel channel, so it always passes a sentinel
13    // — a freshly-constructed token that nobody ever flips. The MCP
14    // server (stage 5+) constructs a real token tied to the request
15    // lifetime and threads it through the same signature.
16    let cancel = CancellationToken::new();
17    match cli.verb {
18        Verb::Init(a) => verbs::init::run(a, &cli.global, &cancel),
19        Verb::Add(a) => verbs::add::run(a, &cli.global, &cancel),
20        Verb::Rm(a) => verbs::rm::run(a, &cli.global, &cancel),
21        Verb::Ls(a) => verbs::ls::run(a, &cli.global, &cancel),
22        Verb::Status(a) => verbs::status::run(a, &cli.global, &cancel),
23        Verb::Sync(a) => verbs::sync::run(a, &cli.global, &cancel),
24        Verb::Update(a) => verbs::update::run(a, &cli.global, &cancel),
25        Verb::Doctor(a) => verbs::doctor::run(a, &cli.global, &cancel),
26        Verb::Serve(a) => verbs::serve::run(a, &cli.global, &cancel),
27        Verb::Import(a) => verbs::import::run(a, &cli.global, &cancel),
28        Verb::Run(a) => verbs::run::run(a, &cli.global, &cancel),
29        Verb::Exec(a) => verbs::exec::run(a, &cli.global, &cancel),
30        Verb::Teardown(a) => verbs::teardown::run(a, &cli.global, &cancel),
31        Verb::MigrateLockfile(a) => verbs::migrate_lockfile::run(a, &cli.global, &cancel),
32    }
33}