cellstate/entity/
summarization_request.rs

1//! `cellstate summarization-request` — Manage summarization requests.
2//!
3//! Subcommands: list, get, update-status.
4
5use anyhow::Result;
6use clap::{Arg, ArgMatches, Command};
7
8use cellstate_core::api_types::{
9    ListSummarizationRequestsResponse, SummarizationRequestResponse,
10    UpdateSummarizationRequestStatusRequest,
11};
12
13use super::client::ApiClient;
14use super::output::OutputConfig;
15
16const BASE: &str = "/api/v1/summarization-requests";
17
18pub fn build_command() -> Command {
19    Command::new("summarization-request")
20        .about("Manage summarization requests")
21        .subcommand_required(true)
22        .subcommand(
23            Command::new("list")
24                .about("List summarization requests")
25                .arg(
26                    Arg::new("limit")
27                        .long("limit")
28                        .default_value("20")
29                        .help("Max results"),
30                )
31                .arg(
32                    Arg::new("offset")
33                        .long("offset")
34                        .default_value("0")
35                        .help("Offset"),
36                ),
37        )
38        .subcommand(
39            Command::new("get")
40                .about("Get summarization request details")
41                .arg(
42                    Arg::new("id")
43                        .required(true)
44                        .help("Summarization request ID"),
45                ),
46        )
47        .subcommand(
48            Command::new("update-status")
49                .about("Update the status of a summarization request")
50                .arg(
51                    Arg::new("id")
52                        .required(true)
53                        .help("Summarization request ID"),
54                )
55                .arg(
56                    Arg::new("status")
57                        .required(true)
58                        .help("New status (pending, in_progress, completed, failed)"),
59                ),
60        )
61}
62
63pub async fn dispatch(
64    matches: &ArgMatches,
65    client: &ApiClient,
66    output: &OutputConfig,
67    _session: &crate::session::CliSession,
68) -> Result<()> {
69    match matches.subcommand() {
70        Some(("list", sub)) => {
71            let limit: i64 = sub.get_one::<String>("limit").unwrap().parse()?;
72            let offset: i64 = sub.get_one::<String>("offset").unwrap().parse()?;
73            let path = format!("{BASE}?limit={limit}&offset={offset}");
74            let resp: ListSummarizationRequestsResponse = client.get(&path).await?;
75            output.print_list(&resp.requests, resp.requests.len() as i64);
76        }
77        Some(("get", sub)) => {
78            let id = sub.get_one::<String>("id").unwrap();
79            let resp: SummarizationRequestResponse = client.get(&format!("{BASE}/{id}")).await?;
80            output.print(&resp);
81        }
82        Some(("update-status", sub)) => {
83            let id = sub.get_one::<String>("id").unwrap();
84            let req = UpdateSummarizationRequestStatusRequest {
85                status: sub.get_one::<String>("status").unwrap().parse()?,
86            };
87            let resp: serde_json::Value =
88                client.patch(&format!("{BASE}/{id}/status"), &req).await?;
89            output.print_value(&resp);
90        }
91        _ => unreachable!("subcommand_required(true) prevents this"),
92    }
93    Ok(())
94}