boxxkite_client/
images.rs1use reqwest::Method;
6use serde::{Deserialize, Serialize};
7
8use crate::client::Client;
9use crate::error::BoxxkiteError;
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
15pub enum ImageBase {
16 #[serde(rename = "boxxkite-default")]
18 BoxxkiteDefault,
19 #[serde(rename = "boxxkite-minimal")]
21 BoxxkiteMinimal,
22 #[serde(rename = "boxxkite-node")]
24 BoxxkiteNode,
25 #[serde(rename = "boxxkite-go")]
28 BoxxkiteGo,
29}
30
31#[derive(Debug, Clone, Default, Serialize)]
33pub struct CreateImageOptions {
34 #[serde(skip_serializing_if = "Option::is_none")]
35 label: Option<String>,
36 #[serde(skip_serializing_if = "Option::is_none")]
37 base: Option<ImageBase>,
38 #[serde(skip_serializing_if = "Option::is_none")]
39 python_packages: Option<Vec<String>>,
40 #[serde(skip_serializing_if = "Option::is_none")]
41 apt_packages: Option<Vec<String>>,
42 #[serde(skip_serializing_if = "Option::is_none")]
43 npm_packages: Option<Vec<String>>,
44}
45
46impl CreateImageOptions {
47 pub fn new() -> Self {
48 Self::default()
49 }
50
51 pub fn label(mut self, label: impl Into<String>) -> Self {
52 self.label = Some(label.into());
53 self
54 }
55
56 pub fn base(mut self, base: ImageBase) -> Self {
58 self.base = Some(base);
59 self
60 }
61
62 pub fn python_packages<I, S>(mut self, packages: I) -> Self
66 where
67 I: IntoIterator<Item = S>,
68 S: Into<String>,
69 {
70 self.python_packages = Some(packages.into_iter().map(Into::into).collect());
71 self
72 }
73
74 pub fn apt_packages<I, S>(mut self, packages: I) -> Self
76 where
77 I: IntoIterator<Item = S>,
78 S: Into<String>,
79 {
80 self.apt_packages = Some(packages.into_iter().map(Into::into).collect());
81 self
82 }
83
84 pub fn npm_packages<I, S>(mut self, packages: I) -> Self
87 where
88 I: IntoIterator<Item = S>,
89 S: Into<String>,
90 {
91 self.npm_packages = Some(packages.into_iter().map(Into::into).collect());
92 self
93 }
94}
95
96#[derive(Debug, Clone, Deserialize)]
101pub struct Image {
102 pub id: String,
103 pub label: Option<String>,
104 #[serde(default)]
105 pub base: String,
106 #[serde(default)]
107 pub python_packages: Vec<String>,
108 #[serde(default)]
109 pub apt_packages: Vec<String>,
110 #[serde(default)]
111 pub npm_packages: Vec<String>,
112 pub status: String,
115 pub digest: Option<String>,
116 pub registry_ref: Option<String>,
117 pub scan_result: Option<serde_json::Value>,
118 pub failure_reason: Option<String>,
119 pub created_at: String,
120 pub completed_at: Option<String>,
121}
122
123impl Client {
124 pub async fn create_image(&self, options: CreateImageOptions) -> Result<Image, BoxxkiteError> {
129 let builder = self.request(Method::POST, "/v1/images").json(&options);
130 self.send(builder).await
131 }
132
133 pub async fn get_image(&self, image_id: &str) -> Result<Image, BoxxkiteError> {
135 let builder = self.request(Method::GET, &format!("/v1/images/{image_id}"));
136 self.send(builder).await
137 }
138
139 pub async fn list_images(&self) -> Result<Vec<Image>, BoxxkiteError> {
141 let builder = self.request(Method::GET, "/v1/images");
142 self.send_or_default(builder).await
143 }
144
145 pub async fn delete_image(&self, image_id: &str) -> Result<(), BoxxkiteError> {
147 let builder = self.request(Method::DELETE, &format!("/v1/images/{image_id}"));
148 self.send_no_content(builder).await
149 }
150}