diff --git a/tvix/eval/src/errors.rs b/tvix/eval/src/errors.rs index 0d12f259a..2cef36f75 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 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 f7f922f16..649679536 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>); impl SourceCode {