cellstate/entity/
summarization_request.rs1use 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}