Skip to main content

objectiveai_sdk/cli/command/logs/functions/inventions/
mod.rs

1pub mod recursive;
2pub mod request;
3pub mod response;
4
5#[derive(clap::Subcommand)]
6pub enum Command {
7    Recursive {
8        #[command(subcommand)]
9        command: recursive::Command,
10    },
11    Request {
12        #[command(subcommand)]
13        command: request::Command,
14    },
15    Response {
16        #[command(subcommand)]
17        command: response::Command,
18    },
19}
20
21#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
22#[serde(untagged)]
23#[schemars(rename = "cli.command.logs.functions.inventions.Request")]
24pub enum Request {
25    #[schemars(title = "Recursive")]
26    Recursive(recursive::Request),
27    #[schemars(title = "Request")]
28    Request(request::Request),
29    #[schemars(title = "Response")]
30    Response(response::Request),
31}
32
33// Exempt from json-schema coverage: tier aggregate (see the root
34// `ResponseItem` in command.rs - TS7056).
35#[objectiveai_sdk_macros::json_schema_ignore]
36#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
37#[schemars(rename = "cli.command.logs.functions.inventions.ResponseItem")]
38#[serde(untagged)]
39pub enum ResponseItem {
40    #[schemars(title = "Recursive")]
41    Recursive(recursive::ResponseItem),
42    #[schemars(title = "Request")]
43    Request(request::Response),
44    #[schemars(title = "Response")]
45    Response(response::ResponseItem),
46}
47
48#[cfg(feature = "mcp")]
49impl crate::cli::command::CommandResponse for ResponseItem {
50    fn into_mcp(self) -> crate::cli::command::McpResponseItem {
51        match self {
52            ResponseItem::Recursive(v) => v.into_mcp(),
53            ResponseItem::Request(v) => v.into_mcp(),
54            ResponseItem::Response(v) => v.into_mcp(),
55        }
56    }
57}
58
59impl TryFrom<Command> for Request {
60    type Error = crate::cli::command::FromArgsError;
61    fn try_from(command: Command) -> Result<Self, Self::Error> {
62        match command {
63            Command::Recursive { command } =>
64                Ok(Request::Recursive(recursive::Request::try_from(command)?)),
65            Command::Request { command } =>
66                Ok(Request::Request(request::Request::try_from(command)?)),
67            Command::Response { command } =>
68                Ok(Request::Response(response::Request::try_from(command)?)),
69        }
70    }
71}
72
73impl crate::cli::command::CommandRequest for Request {
74    fn into_command(&self) -> Vec<String> {
75        match self {
76            Request::Recursive(inner) => inner.into_command(),
77            Request::Request(inner) => inner.into_command(),
78            Request::Response(inner) => inner.into_command(),
79        }
80    }
81}
82
83#[cfg(feature = "cli-executor")]
84pub async fn execute<E: crate::cli::command::CommandExecutor>(
85    executor: &E,
86    request: Request,
87
88        agent_arguments: Option<&crate::cli::command::AgentArguments>,
89    ) -> Result<
90    std::pin::Pin<Box<dyn futures::Stream<Item = Result<ResponseItem, E::Error>> + Send>>,
91    E::Error,
92> {
93    use futures::StreamExt;
94    let stream: std::pin::Pin<Box<dyn futures::Stream<Item = Result<ResponseItem, E::Error>> + Send>> =
95        match request {
96            Request::Recursive(req) => {
97                let inner = recursive::execute(executor, req, agent_arguments).await?;
98                Box::pin(inner.map(|r| r.map(ResponseItem::Recursive)))
99            }
100            Request::Request(req) => {
101                let inner = request::execute(executor, req, agent_arguments).await?;
102                Box::pin(inner.map(|r| r.map(ResponseItem::Request)))
103            }
104            Request::Response(req) => {
105                let inner = response::execute(executor, req, agent_arguments).await?;
106                Box::pin(inner.map(|r| r.map(ResponseItem::Response)))
107            }
108        };
109    Ok(stream)
110}
111
112#[cfg(feature = "cli-executor")]
113pub async fn execute_jq<E: crate::cli::command::CommandExecutor>(
114    executor: &E,
115    request: Request,
116    jq: String,
117
118        agent_arguments: Option<&crate::cli::command::AgentArguments>,
119    ) -> Result<
120    std::pin::Pin<Box<dyn futures::Stream<Item = Result<serde_json::Value, E::Error>> + Send>>,
121    E::Error,
122> {
123    let stream: std::pin::Pin<Box<dyn futures::Stream<Item = Result<serde_json::Value, E::Error>> + Send>> =
124        match request {
125            Request::Recursive(req) => {
126                let inner = recursive::execute_jq(executor, req, jq, agent_arguments).await?;
127                Box::pin(inner)
128            }
129            Request::Request(req) => {
130                let inner = request::execute_jq(executor, req, jq, agent_arguments).await?;
131                Box::pin(inner)
132            }
133            Request::Response(req) => {
134                let inner = response::execute_jq(executor, req, jq, agent_arguments).await?;
135                Box::pin(inner)
136            }
137        };
138    Ok(stream)
139}