diff options
author | Vincent Ambo <mail@tazj.in> | 2022-12-12T16·36+0300 |
---|---|---|
committer | tazjin <tazjin@tvl.su> | 2022-12-21T22·53+0000 |
commit | 51deadd983a7058348554672286736d67d999a67 (patch) | |
tree | 902aa4f52dba24d67c6eb520ea4eba28f40ca7f8 /tvix/eval/src | |
parent | ec3e38c2d6f3eed87bb3f36060bd4dac09a9da75 (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>
Diffstat (limited to 'tvix/eval/src')
-rw-r--r-- | tvix/eval/src/builtins/impure.rs | 3 | ||||
-rw-r--r-- | tvix/eval/src/io.rs | 17 |
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", |