use std::path::{Path, PathBuf};
use super::{read_manifest_from_path_with_identity, Manifest, PackageError};
pub(crate) enum ManifestSearch {
Found {
manifest: Box<Manifest>,
dir: PathBuf,
identity: [u8; 32],
},
Malformed(PackageError),
Missing,
}
impl ManifestSearch {
pub(crate) fn into_result(self) -> Result<Option<(Manifest, PathBuf)>, PackageError> {
match self {
ManifestSearch::Found { manifest, dir, .. } => Ok(Some((*manifest, dir))),
ManifestSearch::Malformed(error) => Err(error),
ManifestSearch::Missing => Ok(None),
}
}
pub(crate) fn into_result_with_identity(
self,
) -> Result<Option<(Manifest, PathBuf, [u8; 32])>, PackageError> {
match self {
ManifestSearch::Found {
manifest,
dir,
identity,
} => Ok(Some((*manifest, dir, identity))),
ManifestSearch::Malformed(error) => Err(error),
ManifestSearch::Missing => Ok(None),
}
}
}
pub(crate) fn load_nearest_manifest(start: &Path) -> ManifestSearch {
let Some(found) = harn_modules::manifest_walk::find_nearest_manifest(start) else {
return ManifestSearch::Missing;
};
match read_manifest_from_path_with_identity(&found.path) {
Ok((manifest, identity)) => ManifestSearch::Found {
manifest: Box::new(manifest),
dir: found.dir,
identity,
},
Err(error) => ManifestSearch::Malformed(error),
}
}
pub(crate) fn find_nearest_manifest_dir(start: &Path) -> Option<PathBuf> {
harn_modules::manifest_walk::find_nearest_manifest(start).map(|found| found.dir)
}
pub(crate) fn nearest_manifest_or_warn(start: &Path) -> Option<(Manifest, PathBuf)> {
match load_nearest_manifest(start) {
ManifestSearch::Found { manifest, dir, .. } => Some((*manifest, dir)),
ManifestSearch::Malformed(error) => {
eprintln!("warning: ignoring malformed harn.toml: {error}");
None
}
ManifestSearch::Missing => None,
}
}