feat(tvix/eval): Support builtins.readDir

Co-authored-by: Griffin Smith <root@gws.fyi>
Change-Id: I5ff19efbe87d8f571f22ab0480500505afa624c5
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6552
Autosubmit: wpcarro <wpcarro@gmail.com>
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
This commit is contained in:
William Carroll 2022-09-06 13:56:40 -07:00 committed by wpcarro
parent 899fbdbddb
commit 41ddc37725
7 changed files with 73 additions and 2 deletions

View file

@ -1,5 +1,6 @@
use crate::spans::ToSpan;
use crate::value::CoercionKind;
use std::io;
use std::path::PathBuf;
use std::rc::Rc;
use std::sync::Arc;
@ -121,6 +122,12 @@ pub enum ErrorKind {
errors: Vec<Error>,
},
/// I/O errors
IO {
path: Option<PathBuf>,
error: Rc<io::Error>,
},
/// Tvix internal warning for features triggered by users that are
/// not actually implemented yet, and without which eval can not
/// proceed.
@ -142,6 +149,15 @@ impl From<Error> for ErrorKind {
}
}
impl From<io::Error> for ErrorKind {
fn from(e: io::Error) -> Self {
ErrorKind::IO {
path: None,
error: Rc::new(e),
}
}
}
#[derive(Clone, Debug)]
pub struct Error {
pub kind: ErrorKind,
@ -306,6 +322,14 @@ to a missing value in the attribute set(s) included via `with`."#,
)
}
ErrorKind::IO { path, error } => {
write!(f, "I/O error: ")?;
if let Some(path) = path {
write!(f, "{}: ", path.display())?;
}
write!(f, "{error}")
}
ErrorKind::NotImplemented(feature) => {
write!(f, "feature not yet implemented in Tvix: {}", feature)
}
@ -583,6 +607,7 @@ impl Error {
| ErrorKind::ReadFileError { .. }
| ErrorKind::ImportParseError { .. }
| ErrorKind::ImportCompilerError { .. }
| ErrorKind::IO { .. }
| ErrorKind::NotImplemented(_) => return None,
};
@ -620,6 +645,7 @@ impl Error {
ErrorKind::ReadFileError { .. } => "E026",
ErrorKind::ImportParseError { .. } => "E027",
ErrorKind::ImportCompilerError { .. } => "E028",
ErrorKind::IO { .. } => "E029",
// Placeholder error while Tvix is under construction.
ErrorKind::NotImplemented(_) => "E999",