use reqwest::Method;
use serde::{Deserialize, Serialize};
use crate::client::Client;
use crate::error::BoxxkiteError;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
pub enum ImageBase {
#[serde(rename = "boxxkite-default")]
BoxxkiteDefault,
#[serde(rename = "boxxkite-minimal")]
BoxxkiteMinimal,
#[serde(rename = "boxxkite-node")]
BoxxkiteNode,
#[serde(rename = "boxxkite-go")]
BoxxkiteGo,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct CreateImageOptions {
#[serde(skip_serializing_if = "Option::is_none")]
label: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
base: Option<ImageBase>,
#[serde(skip_serializing_if = "Option::is_none")]
python_packages: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
apt_packages: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
npm_packages: Option<Vec<String>>,
}
impl CreateImageOptions {
pub fn new() -> Self {
Self::default()
}
pub fn label(mut self, label: impl Into<String>) -> Self {
self.label = Some(label.into());
self
}
pub fn base(mut self, base: ImageBase) -> Self {
self.base = Some(base);
self
}
pub fn python_packages<I, S>(mut self, packages: I) -> Self
where
I: IntoIterator<Item = S>,
S: Into<String>,
{
self.python_packages = Some(packages.into_iter().map(Into::into).collect());
self
}
pub fn apt_packages<I, S>(mut self, packages: I) -> Self
where
I: IntoIterator<Item = S>,
S: Into<String>,
{
self.apt_packages = Some(packages.into_iter().map(Into::into).collect());
self
}
pub fn npm_packages<I, S>(mut self, packages: I) -> Self
where
I: IntoIterator<Item = S>,
S: Into<String>,
{
self.npm_packages = Some(packages.into_iter().map(Into::into).collect());
self
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct Image {
pub id: String,
pub label: Option<String>,
#[serde(default)]
pub base: String,
#[serde(default)]
pub python_packages: Vec<String>,
#[serde(default)]
pub apt_packages: Vec<String>,
#[serde(default)]
pub npm_packages: Vec<String>,
pub status: String,
pub digest: Option<String>,
pub registry_ref: Option<String>,
pub scan_result: Option<serde_json::Value>,
pub failure_reason: Option<String>,
pub created_at: String,
pub completed_at: Option<String>,
}
impl Client {
pub async fn create_image(&self, options: CreateImageOptions) -> Result<Image, BoxxkiteError> {
let builder = self.request(Method::POST, "/v1/images").json(&options);
self.send(builder).await
}
pub async fn get_image(&self, image_id: &str) -> Result<Image, BoxxkiteError> {
let builder = self.request(Method::GET, &format!("/v1/images/{image_id}"));
self.send(builder).await
}
pub async fn list_images(&self) -> Result<Vec<Image>, BoxxkiteError> {
let builder = self.request(Method::GET, "/v1/images");
self.send_or_default(builder).await
}
pub async fn delete_image(&self, image_id: &str) -> Result<(), BoxxkiteError> {
let builder = self.request(Method::DELETE, &format!("/v1/images/{image_id}"));
self.send_no_content(builder).await
}
}