use crate::buildpack_dependency::get_local_buildpackage_dependencies;
use crate::dependency_graph::DependencyNode;
use crate::{
read_buildpack_data, read_buildpackage_data, BuildpackData, BuildpackageData, GenericMetadata,
ReadBuildpackDataError, ReadBuildpackageDataError,
};
use libcnb_data::buildpack::{BuildpackId, BuildpackIdError};
use std::path::PathBuf;
#[derive(Debug)]
pub struct BuildpackPackage<T = GenericMetadata> {
pub path: PathBuf,
pub buildpack_data: BuildpackData<T>,
pub buildpackage_data: Option<BuildpackageData>,
}
impl BuildpackPackage {
#[must_use]
pub fn buildpack_id(&self) -> &BuildpackId {
&self.buildpack_data.buildpack_descriptor.buildpack().id
}
}
impl DependencyNode<BuildpackId, BuildpackIdError> for BuildpackPackage {
fn id(&self) -> BuildpackId {
self.buildpack_data
.buildpack_descriptor
.buildpack()
.id
.clone()
}
fn dependencies(&self) -> Result<Vec<BuildpackId>, BuildpackIdError> {
self.buildpackage_data
.as_ref()
.map(|value| &value.buildpackage_descriptor)
.map_or(Ok(vec![]), get_local_buildpackage_dependencies)
}
}
pub fn read_buildpack_package<P: Into<PathBuf>>(
project_path: P,
) -> Result<BuildpackPackage, ReadBuildpackPackageError> {
let path = project_path.into();
let buildpack_data =
read_buildpack_data(&path).map_err(ReadBuildpackPackageError::ReadBuildpackDataError)?;
let buildpackage_data = read_buildpackage_data(&path)
.map_err(ReadBuildpackPackageError::ReadBuildpackageDataError)?;
Ok(BuildpackPackage {
path,
buildpack_data,
buildpackage_data,
})
}
#[derive(Debug)]
pub enum ReadBuildpackPackageError {
ReadBuildpackDataError(ReadBuildpackDataError),
ReadBuildpackageDataError(ReadBuildpackageDataError),
}