Skip to main content

moonlight_cli/
lib.rs

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}