about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2022-12-31T12·32+0300
committertazjin <tazjin@tvl.su>2023-01-02T22·24+0000
commit49ee3e3b148c1edb74a15e26eacb5911647d1de5 (patch)
tree209f044b2a6635d5850acf1b45221da8ee5988e9
parent31973890a9ee60f50c1426ef7173bd4238234268 (diff)
chore(tvix/eval): implement std::error::Error for tvix_eval::Error r/5565
This makes it easier to interface this error with other crates.

Change-Id: I4947ea6097608f8c0427fb94a819ef748d94ea4b
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7711
Tested-by: BuildkiteCI
Reviewed-by: flokli <flokli@flokli.de>
-rw-r--r--tvix/eval/src/errors.rs19
-rw-r--r--tvix/eval/src/source.rs2
2 files changed, 20 insertions, 1 deletions
diff --git a/tvix/eval/src/errors.rs b/tvix/eval/src/errors.rs
index 0d12f259a5b7..2cef36f757a1 100644
--- a/tvix/eval/src/errors.rs
+++ b/tvix/eval/src/errors.rs
@@ -1,5 +1,6 @@
 use crate::spans::ToSpan;
 use crate::value::{CoercionKind, NixString};
+use std::error;
 use std::io;
 use std::path::PathBuf;
 use std::rc::Rc;
@@ -150,6 +151,24 @@ pub enum ErrorKind {
     NotImplemented(&'static str),
 }
 
+impl error::Error for Error {
+    fn source(&self) -> Option<&(dyn error::Error + 'static)> {
+        match &self.kind {
+            ErrorKind::ThunkForce(err) => err.source(),
+            ErrorKind::ParseErrors(err) => err.first().map(|e| e as &dyn error::Error),
+            ErrorKind::ParseIntError(err) => Some(err),
+            ErrorKind::ImportParseError { errors, .. } => {
+                errors.first().map(|e| e as &dyn error::Error)
+            }
+            ErrorKind::ImportCompilerError { errors, .. } => {
+                errors.first().map(|e| e as &dyn error::Error)
+            }
+            ErrorKind::IO { error, .. } => Some(error.as_ref()),
+            _ => None,
+        }
+    }
+}
+
 impl From<ParseIntError> for ErrorKind {
     fn from(e: ParseIntError) -> Self {
         Self::ParseIntError(e)
diff --git a/tvix/eval/src/source.rs b/tvix/eval/src/source.rs
index f7f922f162ff..649679536080 100644
--- a/tvix/eval/src/source.rs
+++ b/tvix/eval/src/source.rs
@@ -15,7 +15,7 @@ use codemap::{CodeMap, Span};
 
 /// Tracks all source code in a Tvix evaluation for accurate error
 /// reporting.
-#[derive(Clone)]
+#[derive(Clone, Debug)]
 pub struct SourceCode(Rc<RefCell<CodeMap>>);
 
 impl SourceCode {