Skip to main content

grex_cli/cli/
mod.rs

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