Skip to main content

objectiveai_cli/command/swarms/
publish.rs

1//! `swarms publish` — write a `RemoteSwarmBase` to the local filesystem
2//! under `<base>/swarms/<repository>` and return the resulting git
3//! commit SHA. Body and commit message can be supplied inline, from a
4//! JSON file, or produced by Python (the embedded WASI rustpython).
5
6use objectiveai_sdk::cli::command::swarms::publish::{
7    Request, RequestBody, RequestPublishMessage, Response,
8};
9use objectiveai_sdk::swarm::RemoteSwarmBase;
10
11use crate::context::Context;
12use crate::error::Error;
13
14pub async fn execute(ctx: &Context, request: Request) -> Result<Response, Error> {
15    let Request {
16        repository,
17        body,
18        message,
19        overwrite,
20        ..
21    } = request;
22
23    let swarm: RemoteSwarmBase = resolve_body(ctx, body).await?;
24    let msg = resolve_message(message)?;
25    let sha = crate::filesystem::publish::publish_swarm(
26        &ctx.filesystem,
27        &repository,
28        &swarm,
29        &msg,
30        overwrite,
31    )
32    .await?;
33    Ok(Response { sha })
34}
35
36async fn resolve_body(ctx: &Context, body: RequestBody) -> Result<RemoteSwarmBase, Error> {
37    match body {
38        RequestBody::Inline(swarm) => Ok(swarm),
39        RequestBody::File(path) => {
40            let contents = std::fs::read_to_string(&path)
41                .map_err(|e| Error::PromptFileRead(path, e))?;
42            let mut de = serde_json::Deserializer::from_str(&contents);
43            serde_path_to_error::deserialize(&mut de).map_err(Error::InlineDeserialize)
44        }
45        RequestBody::PythonInline(code) => ctx.python().await?.exec_code(&code, None::<()>).await?.ok_or(Error::PythonNoOutput),
46        RequestBody::PythonFile(path) => ctx.python().await?.exec_file(&path, None::<()>).await?.ok_or(Error::PythonNoOutput),
47    }
48}
49
50fn resolve_message(message: RequestPublishMessage) -> Result<String, Error> {
51    match message {
52        RequestPublishMessage::Inline(s) => Ok(s),
53        RequestPublishMessage::File(path) => std::fs::read_to_string(&path)
54            .map_err(|e| Error::PromptFileRead(path, e)),
55    }
56}
57
58pub mod request_schema {
59    use objectiveai_sdk::cli::command::swarms::publish as sdk;
60    use objectiveai_sdk::cli::command::swarms::publish::request_schema::{Request, Response};
61
62    use crate::context::Context;
63    use crate::error::Error;
64
65    pub async fn execute(_ctx: &Context, _request: Request) -> Result<Response, Error> {
66        Ok(objectiveai_sdk::cli::command::ResponseSchema(schemars::schema_for!(sdk::Request)))
67    }
68}
69
70pub mod response_schema {
71    use objectiveai_sdk::cli::command::swarms::publish as sdk;
72    use objectiveai_sdk::cli::command::swarms::publish::response_schema::{Request, Response};
73
74    use crate::context::Context;
75    use crate::error::Error;
76
77    pub async fn execute(_ctx: &Context, _request: Request) -> Result<Response, Error> {
78        Ok(objectiveai_sdk::cli::command::ResponseSchema(schemars::schema_for!(sdk::Response)))
79    }
80}