From 1f8aad0ab41eec3db2e892bf80b6b76d54d36bbc Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Fri, 12 Aug 2022 18:12:28 +0300 Subject: 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 --- tvix/eval/src/compiler.rs | 20 +++++++++++++------- tvix/eval/src/errors.rs | 3 +++ 2 files changed, 16 insertions(+), 7 deletions(-) (limited to 'tvix/eval/src') diff --git a/tvix/eval/src/compiler.rs b/tvix/eval/src/compiler.rs index c56951e464..c5ec664dc2 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 cba46c71f4..d8c3ce41cc 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 { -- cgit 1.4.1