From 4cb9ada0df188ae8484965749a30a2a699a3102e Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Mon, 12 Dec 2022 20:02:39 +0300 Subject: refactor(tvix/eval): use `EvalIO::read_dir` for equivalent builtin Change-Id: I6d782c07166f51587d2f1d06607823268debb5d5 Reviewed-on: https://cl.tvl.fyi/c/depot/+/7574 Reviewed-by: grfn Tested-by: BuildkiteCI --- tvix/eval/src/builtins/impure.rs | 48 +++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 28 deletions(-) (limited to 'tvix/eval/src/builtins/impure.rs') diff --git a/tvix/eval/src/builtins/impure.rs b/tvix/eval/src/builtins/impure.rs index d91f703a6ab7..01a09393720d 100644 --- a/tvix/eval/src/builtins/impure.rs +++ b/tvix/eval/src/builtins/impure.rs @@ -1,14 +1,17 @@ use builtin_macros::builtins; +use smol_str::SmolStr; + use std::{ collections::BTreeMap, - env, io, - rc::{Rc, Weak}, + env, + rc::Weak, time::{SystemTime, UNIX_EPOCH}, }; use crate::{ compiler::GlobalsMap, errors::ErrorKind, + io::FileType, observer::NoOpObserver, spans::LightSpan, value::{Builtin, BuiltinArgument, NixAttrs, Thunk}, @@ -35,33 +38,22 @@ mod impure_builtins { #[builtin("readDir")] fn builtin_read_dir(vm: &mut VM, path: Value) -> Result { let path = coerce_value_to_path(&path, vm)?; - let mk_err = |err: io::Error| ErrorKind::IO { - path: Some(path.clone()), - error: Rc::new(err), - }; - let res = path.read_dir().map_err(mk_err)?.into_iter().flat_map( - |entry| -> Result<(String, &str), ErrorKind> { - let entry = entry.map_err(mk_err)?; - let file_type = entry - .metadata() - .map_err(|err| ErrorKind::IO { - path: Some(entry.path()), - error: Rc::new(err), - })? - .file_type(); - let val = if file_type.is_dir() { - "directory" - } else if file_type.is_file() { - "regular" - } else if file_type.is_symlink() { - "symlink" - } else { - "unknown" - }; - Ok((entry.file_name().to_string_lossy().to_string(), val)) - }, - ); + let res = vm.io().read_dir(path)?.into_iter().map(|(name, ftype)| { + ( + name, + Value::String( + SmolStr::new(match ftype { + FileType::Directory => "directory", + FileType::Regular => "regular", + FileType::Symlink => "symlink", + FileType::Unknown => "unknown", + }) + .into(), + ), + ) + }); + Ok(Value::attrs(NixAttrs::from_iter(res))) } -- cgit 1.4.1