diff options
author | Vincent Ambo <mail@tazj.in> | 2022-12-31T12·32+0300 |
---|---|---|
committer | tazjin <tazjin@tvl.su> | 2023-01-02T22·24+0000 |
commit | 49ee3e3b148c1edb74a15e26eacb5911647d1de5 (patch) | |
tree | 209f044b2a6635d5850acf1b45221da8ee5988e9 | |
parent | 31973890a9ee60f50c1426ef7173bd4238234268 (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.rs | 19 | ||||
-rw-r--r-- | tvix/eval/src/source.rs | 2 |
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 { |