refactor(tvix/eval): implement error variant for path resolution
There are multiple things that can theoretically fail while resolving a path, as some of it includes I/O. A new error variant has been added for this and appropriate errors have been introduced. Change-Id: Ie222245425207dabbf203166eb5ed1eec0114483 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6184 Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org>
This commit is contained in:
parent
e68b6d33b0
commit
1f8aad0ab4
2 changed files with 16 additions and 7 deletions
|
@ -16,7 +16,7 @@
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
use crate::chunk::Chunk;
|
use crate::chunk::Chunk;
|
||||||
use crate::errors::EvalResult;
|
use crate::errors::{Error, EvalResult};
|
||||||
use crate::opcode::{CodeIdx, OpCode};
|
use crate::opcode::{CodeIdx, OpCode};
|
||||||
use crate::value::Value;
|
use crate::value::Value;
|
||||||
use crate::warnings::{EvalWarning, WarningKind};
|
use crate::warnings::{EvalWarning, WarningKind};
|
||||||
|
@ -164,14 +164,15 @@ impl Compiler {
|
||||||
// TODO(tazjin): C++ Nix does not resolve symlinks, but `fs::canonicalize` does.
|
// TODO(tazjin): C++ Nix does not resolve symlinks, but `fs::canonicalize` does.
|
||||||
|
|
||||||
let path = match anchor {
|
let path = match anchor {
|
||||||
rnix::value::Anchor::Absolute => Path::new(&path)
|
rnix::value::Anchor::Absolute => Path::new(&path).to_owned(),
|
||||||
.canonicalize()
|
|
||||||
.expect("TODO: error variant"),
|
|
||||||
|
|
||||||
rnix::value::Anchor::Home => {
|
rnix::value::Anchor::Home => {
|
||||||
let mut buf = dirs::home_dir().expect("TODO: error variant");
|
let mut buf = dirs::home_dir().ok_or_else(|| {
|
||||||
|
Error::PathResolution("failed to determine home directory".into())
|
||||||
|
})?;
|
||||||
|
|
||||||
buf.push(&path);
|
buf.push(&path);
|
||||||
buf.canonicalize().expect("TODO: error variant")
|
buf
|
||||||
}
|
}
|
||||||
|
|
||||||
rnix::value::Anchor::Relative => todo!("resolve relative to file location"),
|
rnix::value::Anchor::Relative => todo!("resolve relative to file location"),
|
||||||
|
@ -183,7 +184,12 @@ impl Compiler {
|
||||||
rnix::value::Anchor::Store => todo!("resolve <...> lookups at runtime"),
|
rnix::value::Anchor::Store => todo!("resolve <...> lookups at runtime"),
|
||||||
};
|
};
|
||||||
|
|
||||||
let idx = self.chunk.push_constant(Value::Path(path));
|
let value =
|
||||||
|
Value::Path(path.canonicalize().map_err(|e| {
|
||||||
|
Error::PathResolution(format!("failed to canonicalise path: {}", e))
|
||||||
|
})?);
|
||||||
|
|
||||||
|
let idx = self.chunk.push_constant(value);
|
||||||
self.chunk.push_op(OpCode::OpConstant(idx));
|
self.chunk.push_op(OpCode::OpConstant(idx));
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -23,6 +23,9 @@ pub enum Error {
|
||||||
lhs: &'static str,
|
lhs: &'static str,
|
||||||
rhs: &'static str,
|
rhs: &'static str,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Resolving a user-supplied path literal failed in some way.
|
||||||
|
PathResolution(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Display for Error {
|
impl Display for Error {
|
||||||
|
|
Loading…
Reference in a new issue