about summary refs log tree commit diff
path: root/tvix/eval/src
diff options
context:
space:
mode:
Diffstat (limited to 'tvix/eval/src')
-rw-r--r--tvix/eval/src/builtins/impure.rs3
-rw-r--r--tvix/eval/src/io.rs17
2 files changed, 18 insertions, 2 deletions
diff --git a/tvix/eval/src/builtins/impure.rs b/tvix/eval/src/builtins/impure.rs
index c2ba2f2a07f7..d91f703a6ab7 100644
--- a/tvix/eval/src/builtins/impure.rs
+++ b/tvix/eval/src/builtins/impure.rs
@@ -28,7 +28,8 @@ mod impure_builtins {
 
     #[builtin("pathExists")]
     fn builtin_path_exists(vm: &mut VM, s: Value) -> Result<Value, ErrorKind> {
-        Ok(coerce_value_to_path(&s, vm)?.exists().into())
+        let path = coerce_value_to_path(&s, vm)?;
+        vm.io().path_exists(path).map(Value::Bool)
     }
 
     #[builtin("readDir")]
diff --git a/tvix/eval/src/io.rs b/tvix/eval/src/io.rs
index fd0680f3c2a5..627eb848dcba 100644
--- a/tvix/eval/src/io.rs
+++ b/tvix/eval/src/io.rs
@@ -21,6 +21,9 @@ use crate::errors::ErrorKind;
 
 /// Defines how filesystem interaction occurs inside of tvix-eval.
 pub trait EvalIO {
+    /// Verify whether the file at the specified path exists.
+    fn path_exists(&self, path: PathBuf) -> Result<bool, ErrorKind>;
+
     /// Read the file at the specified path to a string.
     fn read_to_string(&self, path: PathBuf) -> Result<String, ErrorKind>;
 }
@@ -32,8 +35,14 @@ pub struct StdIO;
 
 #[cfg(feature = "impure")]
 impl EvalIO for StdIO {
+    fn path_exists(&self, path: PathBuf) -> Result<bool, ErrorKind> {
+        path.try_exists().map_err(|e| ErrorKind::IO {
+            path: Some(path),
+            error: std::rc::Rc::new(e),
+        })
+    }
+
     fn read_to_string(&self, path: PathBuf) -> Result<String, ErrorKind> {
-        let path: PathBuf = path.into();
         std::fs::read_to_string(&path).map_err(|e| ErrorKind::IO {
             path: Some(path),
             error: std::rc::Rc::new(e),
@@ -46,6 +55,12 @@ impl EvalIO for StdIO {
 pub struct DummyIO;
 
 impl EvalIO for DummyIO {
+    fn path_exists(&self, _: PathBuf) -> Result<bool, ErrorKind> {
+        Err(ErrorKind::NotImplemented(
+            "I/O methods are not implemented in DummyIO",
+        ))
+    }
+
     fn read_to_string(&self, _: PathBuf) -> Result<String, ErrorKind> {
         Err(ErrorKind::NotImplemented(
             "I/O methods are not implemented in DummyIO",