Skip to main content

synth_ai/
containers_api.rs

1use std::sync::Arc;
2
3use serde::{Deserialize, Serialize};
4use crate::models::{JsonMap, ResourceList};
5use crate::openapi_paths;
6use crate::transport::Transport;
7use crate::types::Result;
8
9#[derive(Debug, Clone, Serialize, Deserialize, Default)]
10pub struct HostedContainerSpec {
11    #[serde(skip_serializing_if = "Option::is_none")]
12    pub name: Option<String>,
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub app: Option<String>,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub dockerfile: Option<String>,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub context: Option<String>,
19    #[serde(flatten)]
20    pub extra: JsonMap,
21}
22
23#[derive(Debug, Clone, Serialize, Deserialize, Default)]
24pub struct HostedContainer {
25    #[serde(default)]
26    pub container_id: Option<String>,
27    #[serde(default)]
28    pub id: Option<String>,
29    #[serde(default)]
30    pub status: Option<String>,
31    #[serde(default)]
32    pub container_url: Option<String>,
33    #[serde(flatten)]
34    pub extra: JsonMap,
35}
36
37#[derive(Clone)]
38pub struct ContainersClient {
39    transport: Arc<Transport>,
40}
41
42impl ContainersClient {
43    pub(crate) fn new(transport: Arc<Transport>) -> Self {
44        Self { transport }
45    }
46
47    pub async fn create(&self, request: &HostedContainerSpec) -> Result<HostedContainer> {
48        self.transport
49            .post_json(openapi_paths::API_V1_CONTAINERS, request)
50            .await
51    }
52
53    pub async fn list(&self) -> Result<ResourceList<HostedContainer>> {
54        self.transport.get_json(openapi_paths::API_V1_CONTAINERS).await
55    }
56
57    pub async fn get(&self, container_id: &str) -> Result<HostedContainer> {
58        self.transport
59            .get_json(&openapi_paths::api_v1_container(container_id))
60            .await
61    }
62
63    pub async fn delete(&self, container_id: &str) -> Result<()> {
64        self.transport
65            .delete_empty(&openapi_paths::api_v1_container(container_id))
66            .await
67    }
68}