about summary refs log tree commit diff
path: root/tvix/eval
diff options
context:
space:
mode:
Diffstat (limited to 'tvix/eval')
-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 {