synth_ai/
containers_api.rs1use 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}