use std::collections::HashMap;
use crate::error::ImageError;
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct ImageConfig {
pub env: Vec<String>,
pub cmd: Option<Vec<String>>,
pub entrypoint: Option<Vec<String>>,
pub working_dir: Option<String>,
pub user: Option<String>,
pub exposed_ports: Vec<String>,
pub volumes: Vec<String>,
pub labels: HashMap<String, String>,
pub stop_signal: Option<String>,
}
impl ImageConfig {
pub fn parse(bytes: &[u8]) -> Result<(Self, Vec<String>), ImageError> {
let oci_config: oci_spec::image::ImageConfiguration = serde_json::from_slice(bytes)
.map_err(|e| ImageError::ConfigParse(format!("failed to parse image config: {e}")))?;
let config = oci_config.config();
let image_config = Self {
env: config
.as_ref()
.and_then(|c| c.env().clone())
.unwrap_or_default(),
cmd: config.as_ref().and_then(|c| c.cmd().clone()),
entrypoint: config.as_ref().and_then(|c| c.entrypoint().clone()),
working_dir: config.as_ref().and_then(|c| c.working_dir().clone()),
user: config.as_ref().and_then(|c| c.user().clone()),
exposed_ports: config
.as_ref()
.and_then(|c| c.exposed_ports().clone())
.unwrap_or_default(),
volumes: config
.as_ref()
.and_then(|c| c.volumes().clone())
.unwrap_or_default(),
labels: config
.as_ref()
.and_then(|c| c.labels().as_ref())
.cloned()
.unwrap_or_default(),
stop_signal: config.as_ref().and_then(|c| c.stop_signal().clone()),
};
let diff_ids = oci_config.rootfs().diff_ids().to_vec();
Ok((image_config, diff_ids))
}
}