1mod args;
2mod batch;
3mod command;
4mod command_form;
5mod config;
6mod execute;
7mod input;
8mod run_once;
9mod types;
10
11use anyhow::Context;
12use args::{Cli, CliCommand};
13use clap::Parser;
14use moonlight_core::storage::JsonlStorageReader;
15
16pub async fn run_cli() -> anyhow::Result<()> {
17 let cli = Cli::parse();
18
19 match cli.command {
20 CliCommand::Run(args) => run_once::run(args).await,
21 CliCommand::Batch(args) => batch::batch(args).await,
22 CliCommand::List(args) => {
23 let storage = JsonlStorageReader::new(args.output.storage.storage_path());
24 let runs = storage.list_page(args.limit, args.offset).await?;
25 print_json(&runs, args.output.compact)?;
26 Ok(())
27 }
28 CliCommand::Stats(args) => {
29 let storage = JsonlStorageReader::new(args.storage.storage_path());
30 print_json(&storage.stats().await?, args.compact)?;
31 Ok(())
32 }
33 CliCommand::Show(args) => {
34 let storage = JsonlStorageReader::new(args.output.storage.storage_path());
35 let run = storage
36 .get(args.id)
37 .await?
38 .with_context(|| format!("comparison run {} was not found", args.id))?;
39 print_json(&run, args.output.compact)?;
40 Ok(())
41 }
42 }
43}
44
45fn print_json(value: &impl serde::Serialize, compact: bool) -> anyhow::Result<()> {
46 if compact {
47 println!("{}", serde_json::to_string(value)?);
48 } else {
49 println!("{}", serde_json::to_string_pretty(value)?);
50 }
51 Ok(())
52}