fix(cli): a missing [nodes] directory refuses with a clean message

An existence pre-check on the [nodes] pointer target fires before the
crate pipeline: the refusal names the absent directory and keeps the
[nodes] context, instead of leaking cargo metadata's os-error wrap.
Existing-but-broken crates keep the ArtifactMissing/CargoMetadata
errors under the pointer prefix.

closes #245
This commit is contained in:
2026-07-12 19:52:01 +02:00
parent c3b5099014
commit d79d5af036
+18 -3
View File
@@ -59,6 +59,10 @@ pub enum ProjectError {
Charter(String),
MultiCrate(usize),
NodesPointer { pointer: String, inner: Box<ProjectError> },
/// #245: the `[nodes]` pointer target does not exist — checked before
/// handing off to `load_crate`, so this never reaches the cargo-metadata
/// probe (whose raw os-error text would otherwise leak through).
PointerDirMissing(PathBuf),
}
impl fmt::Display for ProjectError {
@@ -95,6 +99,7 @@ impl fmt::Display for ProjectError {
f,
"node crate at `{pointer}` (from [nodes] in Aura.toml): {inner}"
),
Self::PointerDirMissing(p) => write!(f, "{} does not exist", p.display()),
}
}
}
@@ -488,9 +493,19 @@ pub fn load(root: &Path, release: bool) -> Result<ProjectEnv, ProjectError> {
None
}
}
[pointer] => Some(load_crate(&root.join(pointer), release).map_err(|e| {
ProjectError::NodesPointer { pointer: pointer.clone(), inner: Box::new(e) }
})?),
[pointer] => {
let dir = root.join(pointer);
if !dir.is_dir() {
return Err(ProjectError::NodesPointer {
pointer: pointer.clone(),
inner: Box::new(ProjectError::PointerDirMissing(dir)),
});
}
Some(load_crate(&dir, release).map_err(|e| ProjectError::NodesPointer {
pointer: pointer.clone(),
inner: Box::new(e),
})?)
}
many => return Err(ProjectError::MultiCrate(many.len())),
};
Ok(ProjectEnv {