use std::collections::HashMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", default)]
pub struct ImageSpec {
#[serde(skip_serializing_if = "Option::is_none")]
pub base: Option<BaseImage>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub build_steps: Vec<ImageBuildStep>,
#[serde(skip_serializing_if = "HashMap::is_empty")]
pub env: HashMap<String, String>,
#[serde(skip_serializing_if = "ImageArchitecture::is_unspecified")]
pub architecture: ImageArchitecture,
#[serde(skip_serializing_if = "String::is_empty")]
pub python_version: String,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum BaseImage {
#[default]
#[serde(rename = "BASE_IMAGE_UNSPECIFIED")]
Unspecified,
#[serde(rename = "BASE_IMAGE_DEBIAN")]
Debian,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum ImageArchitecture {
#[default]
#[serde(rename = "IMAGE_ARCHITECTURE_UNSPECIFIED")]
Unspecified,
#[serde(rename = "IMAGE_ARCHITECTURE_AMD64")]
Amd64,
#[serde(rename = "IMAGE_ARCHITECTURE_ARM64")]
Arm64,
}
impl ImageArchitecture {
#[allow(clippy::trivially_copy_pass_by_ref)]
fn is_unspecified(&self) -> bool {
matches!(self, ImageArchitecture::Unspecified)
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum ImageBuildStep {
AptInstall(PackageInstall),
PipInstall(PackageInstall),
RunCommand(RunCommand),
AddLocalFile(AddLocalFile),
AddLocalDir(AddLocalDir),
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(default)]
pub struct PackageInstall {
#[serde(skip_serializing_if = "Vec::is_empty")]
pub packages: Vec<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(default)]
pub struct RunCommand {
#[serde(skip_serializing_if = "String::is_empty")]
pub command: String,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", default)]
pub struct AddLocalFile {
#[serde(skip_serializing_if = "String::is_empty")]
pub content_sha256: String,
#[serde(skip_serializing_if = "String::is_empty")]
pub remote_path: String,
#[serde(skip_serializing_if = "is_zero")]
pub mode: u32,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", default)]
pub struct AddLocalDir {
#[serde(skip_serializing_if = "String::is_empty")]
pub remote_path: String,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub files: Vec<AddLocalDirFile>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", default)]
pub struct AddLocalDirFile {
#[serde(skip_serializing_if = "String::is_empty")]
pub relative_path: String,
#[serde(skip_serializing_if = "String::is_empty")]
pub content_sha256: String,
#[serde(skip_serializing_if = "is_zero")]
pub mode: u32,
}
#[allow(clippy::trivially_copy_pass_by_ref)]
fn is_zero(n: &u32) -> bool {
*n == 0
}