about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2022-12-12T16·36+0300
committertazjin <tazjin@tvl.su>2022-12-21T22·53+0000
commit51deadd983a7058348554672286736d67d999a67 (patch)
tree902aa4f52dba24d67c6eb520ea4eba28f40ca7f8
parentec3e38c2d6f3eed87bb3f36060bd4dac09a9da75 (diff)
refactor(tvix/eval): use `EvalIO::path_exists` for the builtin r/5463
Change-Id: I49822ce30137777865e7370ee86666636e277b35
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7573
Tested-by: BuildkiteCI
Reviewed-by: grfn <grfn@gws.fyi>
-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 c2ba2f2a07..d91f703a6a 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 fd0680f3c2..627eb848dc 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",