#![cfg(feature = "buildkit_providerless")]
pub use bollard_buildkit_proto::fsutil;
pub use bollard_buildkit_proto::health;
pub use bollard_buildkit_proto::moby;
use std::collections::HashMap;
use std::fmt::Display;
use std::path::Path;
use super::build::ImageBuildOutputCompression;
#[derive(Debug, Clone, Default, PartialEq)]
pub struct ImageExporterOutput {
pub(crate) name: String,
pub(crate) compression: ImageBuildOutputCompression,
pub(crate) compression_level: Option<u8>,
pub(crate) force_compression: bool,
pub(crate) oci_mediatypes: bool,
pub(crate) annotation: HashMap<String, String>,
}
#[derive(Default, Debug, Copy, Clone, PartialEq)]
#[non_exhaustive]
pub enum ImageExporterOCIOutputCompression {
Uncompressed,
#[default]
Gzip,
Estargz,
Zstd,
}
impl Display for ImageExporterOCIOutputCompression {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ImageExporterOCIOutputCompression::Uncompressed => write!(f, "uncompressed"),
ImageExporterOCIOutputCompression::Gzip => write!(f, "gzip"),
ImageExporterOCIOutputCompression::Estargz => write!(f, "estargz"),
ImageExporterOCIOutputCompression::Zstd => write!(f, "zstd"),
}
}
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct ImageExporterRequest {
pub(crate) output: ImageExporterOutput,
pub(crate) path: std::path::PathBuf,
}
impl ImageExporterOutput {
pub fn builder(name: &str) -> ImageExporterOutputBuilder {
ImageExporterOutputBuilder::new(name)
}
fn new(name: &str) -> Self {
Self {
name: String::from(name),
..Default::default()
}
}
pub(crate) fn into_map(self) -> HashMap<String, String> {
let mut attrs = HashMap::new();
attrs.insert(String::from("name"), self.name);
attrs.insert(String::from("compression"), self.compression.to_string());
if let Some(compression_level) = self.compression_level {
attrs.insert(
String::from("compression-level"),
compression_level.to_string(),
);
}
attrs.insert(
String::from("force-compression"),
self.force_compression.to_string(),
);
attrs.insert(
String::from("oci-mediatypes"),
self.oci_mediatypes.to_string(),
);
for (key, value) in self.annotation {
attrs.insert(format!("annotation.{}", key), value);
}
attrs
}
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct ImageExporterOutputBuilder {
inner: ImageExporterOutput,
}
impl ImageExporterOutputBuilder {
pub fn new(name: &str) -> Self {
Self {
inner: ImageExporterOutput {
name: String::from(name),
..Default::default()
},
}
}
pub fn compression(mut self, compression: &ImageBuildOutputCompression) -> Self {
compression.clone_into(&mut self.inner.compression);
self
}
pub fn compression_level(mut self, compression_level: u8) -> Self {
self.inner.compression_level = Some(compression_level);
self
}
pub fn force_compression(mut self, force_compression: bool) -> Self {
self.inner.force_compression = force_compression;
self
}
pub fn oci_mediatypes(mut self, oci_mediatypes: bool) -> Self {
self.inner.oci_mediatypes = oci_mediatypes;
self
}
pub fn annotation(mut self, key: &str, value: &str) -> Self {
self.inner
.annotation
.insert(String::from(key), String::from(value));
self
}
pub fn dest(self, path: &Path) -> ImageExporterRequest {
ImageExporterRequest {
output: self.inner,
path: path.to_owned(),
}
}
}