use std::path::{Path, PathBuf};
use super::{read_manifest_from_path, Manifest, PackageError};
pub(crate) enum ManifestSearch {
Found {
manifest: Box<Manifest>,
dir: PathBuf,
},
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 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(&found.path) {
Ok(manifest) => ManifestSearch::Found {
manifest: Box::new(manifest),
dir: found.dir,
},
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,
}
}