cellstate/entity/
batch.rs

1//! `cellstate batch` — Perform batch operations on trajectories, artifacts, and notes.
2//!
3//! Subcommands: trajectories, artifacts, notes.
4
5use anyhow::Result;
6use clap::{Arg, ArgMatches, Command};
7
8use super::client::ApiClient;
9use super::output::OutputConfig;
10
11const BASE: &str = "/api/v1/batch";
12
13pub fn build_command() -> Command {
14    Command::new("batch")
15        .about("Perform batch operations on entities")
16        .subcommand_required(true)
17        .subcommand(
18            Command::new("trajectories")
19                .about("Batch create/update/delete trajectories")
20                .arg(
21                    Arg::new("json")
22                        .required(true)
23                        .help("JSON payload (BatchTrajectoryRequest)"),
24                ),
25        )
26        .subcommand(
27            Command::new("artifacts")
28                .about("Batch create/update/delete artifacts")
29                .arg(
30                    Arg::new("json")
31                        .required(true)
32                        .help("JSON payload (BatchArtifactRequest)"),
33                ),
34        )
35        .subcommand(
36            Command::new("notes")
37                .about("Batch create/update/delete notes")
38                .arg(
39                    Arg::new("json")
40                        .required(true)
41                        .help("JSON payload (BatchNoteRequest)"),
42                ),
43        )
44}
45
46pub async fn dispatch(
47    matches: &ArgMatches,
48    client: &ApiClient,
49    output: &OutputConfig,
50    _session: &crate::session::CliSession,
51) -> Result<()> {
52    match matches.subcommand() {
53        Some(("trajectories", sub)) => {
54            let json_str = sub.get_one::<String>("json").unwrap();
55            let req: serde_json::Value = serde_json::from_str(json_str)?;
56            let resp: serde_json::Value = client
57                .post_raw(&format!("{BASE}/trajectories"), &req)
58                .await?;
59            output.print_value(&resp);
60        }
61        Some(("artifacts", sub)) => {
62            let json_str = sub.get_one::<String>("json").unwrap();
63            let req: serde_json::Value = serde_json::from_str(json_str)?;
64            let resp: serde_json::Value =
65                client.post_raw(&format!("{BASE}/artifacts"), &req).await?;
66            output.print_value(&resp);
67        }
68        Some(("notes", sub)) => {
69            let json_str = sub.get_one::<String>("json").unwrap();
70            let req: serde_json::Value = serde_json::from_str(json_str)?;
71            let resp: serde_json::Value = client.post_raw(&format!("{BASE}/notes"), &req).await?;
72            output.print_value(&resp);
73        }
74        _ => unreachable!("subcommand_required(true) prevents this"),
75    }
76    Ok(())
77}