objectiveai_sdk/cli/command/db/query/
mod.rs1use crate::cli::command::CommandRequest;
24
25#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
26#[schemars(rename = "cli.command.db.query.Request")]
27pub struct Request {
28 pub path_type: Path,
29 pub query: String,
32 #[serde(flatten)]
34 pub base: crate::cli::command::RequestBase,
35}
36
37#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
38#[schemars(rename = "cli.command.db.query.Path")]
39pub enum Path {
40 #[serde(rename = "db/query")]
41 DbQuery,
42}
43
44impl CommandRequest for Request {
45 fn into_command(&self) -> Vec<String> {
46 let mut argv = vec![
47 "db".to_string(),
48 "query".to_string(),
49 "--query".to_string(),
50 self.query.clone(),
51 ];
52 self.base.push_flags(&mut argv);
53 argv
54 }
55
56 fn request_base(&self) -> &crate::cli::command::RequestBase {
57 &self.base
58 }
59
60 fn request_base_mut(&mut self) -> Option<&mut crate::cli::command::RequestBase> {
61 Some(&mut self.base)
62 }
63}
64
65#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
70#[schemars(rename = "cli.command.db.query.Column")]
71pub struct Column {
72 pub name: String,
73 pub r#type: String,
74}
75
76#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
78#[schemars(rename = "cli.command.db.query.Response")]
79pub struct Response {
80 pub command_tag: String,
86 pub columns: Vec<Column>,
89 pub rows: Vec<Vec<serde_json::Value>>,
98 pub truncated: bool,
102}
103
104#[derive(clap::Args)]
105pub struct Args {
106 #[arg(long)]
108 pub query: String,
109 #[command(flatten)]
110 pub base: crate::cli::command::RequestBaseArgs,
111}
112
113#[derive(clap::Args)]
114#[command(args_conflicts_with_subcommands = true)]
115pub struct Command {
116 #[command(flatten)]
117 pub args: Args,
118 #[command(subcommand)]
119 pub schema: Option<Schema>,
120}
121
122#[derive(clap::Subcommand)]
123pub enum Schema {
124 RequestSchema(request_schema::Args),
126 ResponseSchema(response_schema::Args),
128}
129
130impl TryFrom<Args> for Request {
131 type Error = crate::cli::command::FromArgsError;
132 fn try_from(args: Args) -> Result<Self, Self::Error> {
133 Ok(Self {
134 path_type: Path::DbQuery,
135 query: args.query,
136 base: args.base.into(),
137 })
138 }
139}
140
141#[cfg(feature = "cli-executor")]
142pub async fn execute<E: crate::cli::command::CommandExecutor>(
143 executor: &E,
144 mut request: Request,
145 agent_arguments: Option<&crate::cli::command::AgentArguments>,
146) -> Result<Response, E::Error> {
147 request.base.clear_transform();
148 executor.execute_one(request, agent_arguments).await
149}
150
151#[cfg(feature = "cli-executor")]
152pub async fn execute_transform<E: crate::cli::command::CommandExecutor>(
153 executor: &E,
154 mut request: Request,
155 transform: crate::cli::command::Transform,
156 agent_arguments: Option<&crate::cli::command::AgentArguments>,
157) -> Result<serde_json::Value, E::Error> {
158 request.base.set_transform(transform);
159 executor.execute_one(request, agent_arguments).await
160}
161
162#[cfg(feature = "mcp")]
163impl crate::cli::command::CommandResponse for Response {
164 fn into_mcp(self) -> crate::cli::command::McpResponseItem {
165 crate::cli::command::McpResponseItem::JSONL(serde_json::to_value(self).unwrap())
166 }
167}
168
169pub mod request_schema;
170pub mod response_schema;