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 request_base(&self) -> &crate::cli::command::RequestBase {
46 &self.base
47 }
48
49 fn request_base_mut(&mut self) -> Option<&mut crate::cli::command::RequestBase> {
50 Some(&mut self.base)
51 }
52}
53
54#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
59#[schemars(rename = "cli.command.db.query.Column")]
60pub struct Column {
61 pub name: String,
62 pub r#type: String,
63}
64
65#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
67#[schemars(rename = "cli.command.db.query.Response")]
68pub struct Response {
69 pub command_tag: String,
75 pub columns: Vec<Column>,
78 pub rows: Vec<Vec<serde_json::Value>>,
87 pub truncated: bool,
91}
92
93#[derive(clap::Args)]
94#[command(group(clap::ArgGroup::new("query_required").required(true).args(["query"])))]
95pub struct Args {
96 #[arg(long)]
98 pub query: Option<String>,
99 #[command(flatten)]
100 pub base: crate::cli::command::RequestBaseArgs,
101}
102
103#[derive(clap::Args)]
104#[command(args_conflicts_with_subcommands = true)]
105pub struct Command {
106 #[command(flatten)]
107 pub args: Args,
108 #[command(subcommand)]
109 pub schema: Option<Schema>,
110}
111
112#[derive(clap::Subcommand)]
113pub enum Schema {
114 RequestSchema(request_schema::Args),
116 ResponseSchema(response_schema::Args),
118}
119
120impl TryFrom<Args> for Request {
121 type Error = crate::cli::command::FromArgsError;
122 fn try_from(args: Args) -> Result<Self, Self::Error> {
123 Ok(Self {
124 path_type: Path::DbQuery,
125 query: args.query.ok_or_else(|| {
126 crate::cli::command::FromArgsError::path_parse(
127 "query",
128 "--query is required".to_string(),
129 )
130 })?,
131 base: args.base.into(),
132 })
133 }
134}
135
136#[cfg(feature = "cli-executor")]
137pub async fn execute<E: crate::cli::command::CommandExecutor>(
138 executor: &E,
139 mut request: Request,
140 agent_arguments: Option<&crate::cli::command::AgentArguments>,
141) -> Result<Response, E::Error> {
142 request.base.clear_transform();
143 executor.execute_one(request, agent_arguments).await
144}
145
146#[cfg(feature = "cli-executor")]
147pub async fn execute_transform<E: crate::cli::command::CommandExecutor>(
148 executor: &E,
149 mut request: Request,
150 transform: crate::cli::command::Transform,
151 agent_arguments: Option<&crate::cli::command::AgentArguments>,
152) -> Result<serde_json::Value, E::Error> {
153 request.base.set_transform(transform);
154 executor.execute_one(request, agent_arguments).await
155}
156
157#[cfg(feature = "mcp")]
158impl crate::cli::command::CommandResponse for Response {
159 fn into_mcp(self) -> crate::cli::command::McpResponseItem {
160 crate::cli::command::McpResponseItem::JSONL(serde_json::to_value(self).unwrap())
161 }
162}
163
164pub mod request_schema;
165pub mod response_schema;