From 49ee3e3b148c1edb74a15e26eacb5911647d1de5 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Sat, 31 Dec 2022 15:32:35 +0300 Subject: [PATCH] chore(tvix/eval): implement std::error::Error for tvix_eval::Error 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 --- tvix/eval/src/errors.rs | 19 +++++++++++++++++++ tvix/eval/src/source.rs | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) 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 {