about summary refs log tree commit diff
path: root/tvix
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2022-08-12T15·12+0300
committertazjin <tazjin@tvl.su>2022-08-28T11·02+0000
commit1f8aad0ab41eec3db2e892bf80b6b76d54d36bbc (patch)
tree7a6acf134af77c4213d11010f1073cdc1ceb0471 /tvix
parente68b6d33b074efa8c745b4ee7c92518cf6dcc1ca (diff)
refactor(tvix/eval): implement error variant for path resolution r/4518
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>
Diffstat (limited to 'tvix')
-rw-r--r--tvix/eval/src/compiler.rs20
-rw-r--r--tvix/eval/src/errors.rs3
2 files changed, 16 insertions, 7 deletions
diff --git a/tvix/eval/src/compiler.rs b/tvix/eval/src/compiler.rs
index c56951e46483..c5ec664dc2cf 100644
--- a/tvix/eval/src/compiler.rs
+++ b/tvix/eval/src/compiler.rs
@@ -16,7 +16,7 @@
 use std::path::Path;
 
 use crate::chunk::Chunk;
-use crate::errors::EvalResult;
+use crate::errors::{Error, EvalResult};
 use crate::opcode::{CodeIdx, OpCode};
 use crate::value::Value;
 use crate::warnings::{EvalWarning, WarningKind};
@@ -164,14 +164,15 @@ impl Compiler {
         // TODO(tazjin): C++ Nix does not resolve symlinks, but `fs::canonicalize` does.
 
         let path = match anchor {
-            rnix::value::Anchor::Absolute => Path::new(&path)
-                .canonicalize()
-                .expect("TODO: error variant"),
+            rnix::value::Anchor::Absolute => Path::new(&path).to_owned(),
 
             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.canonicalize().expect("TODO: error variant")
+                buf
             }
 
             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"),
         };
 
-        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));
 
         Ok(())
diff --git a/tvix/eval/src/errors.rs b/tvix/eval/src/errors.rs
index cba46c71f4cd..d8c3ce41cc1d 100644
--- a/tvix/eval/src/errors.rs
+++ b/tvix/eval/src/errors.rs
@@ -23,6 +23,9 @@ pub enum Error {
         lhs: &'static str,
         rhs: &'static str,
     },
+
+    // Resolving a user-supplied path literal failed in some way.
+    PathResolution(String),
 }
 
 impl Display for Error {