use std::path::Path; use anyhow::Result; use crate::package_installer::{AptConfig, PackageRequest}; use crate::{ImageSpec, Stage}; #[derive(Debug, Clone, PartialEq, Eq)] pub struct BuildPlan { spec: ImageSpec, } impl BuildPlan { pub fn compile(spec: ImageSpec) -> Result { spec.validate()?; Ok(Self { spec }) } pub fn spec(&self) -> &ImageSpec { &self.spec } pub fn stages(&self) -> &'static [Stage] { &Stage::ORDERED } pub fn dependencies(&self, stage: Stage) -> &'static [Stage] { stage.dependencies() } /// Compile package-installation inputs from the validated immutable spec. /// This keeps ALT's external resolver behind the typed adapter boundary. pub fn package_request( &self, workdir: impl AsRef, apt_config: impl AsRef, ) -> Result { PackageRequest::new( workdir, AptConfig::new(apt_config)?, self.spec.packages.base.iter().cloned(), self.spec .packages .selectors .iter() .map(|selector| selector.as_str().to_owned()), ) } }