From 3892562be909cab56d4337e5b2ce121a4d7e534b Mon Sep 17 00:00:00 2001 From: elkowar <5300871+elkowar@users.noreply.github.com> Date: Tue, 20 Jul 2021 19:26:19 +0200 Subject: [PATCH] Improve errors for attribute parsing --- src/config/attributes.rs | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/config/attributes.rs b/src/config/attributes.rs index 536bbfa..b2e668d 100644 --- a/src/config/attributes.rs +++ b/src/config/attributes.rs @@ -23,19 +23,19 @@ pub enum AttrError { #[error("Missing required attribute {0}")] MissingRequiredAttr(Span, AttrName), - #[error("Failed to parse attribute value {0} in this context")] - AttrTypeError(Span, AttrName), - #[error("{1}")] EvaluationError(Span, EvalError), + + #[error("{1}")] + Other(Span, Box), } impl AttrError { pub fn span(&self) -> Span { match self { AttrError::MissingRequiredAttr(span, _) => *span, - AttrError::AttrTypeError(span, _) => *span, AttrError::EvaluationError(span, _) => *span, + AttrError::Other(span, _) => *span, } } } @@ -84,16 +84,24 @@ impl Attributes { } } - pub fn primitive_required(&mut self, key: &str) -> Result { + pub fn primitive_required(&mut self, key: &str) -> Result + where + E: std::error::Error + 'static, + T: FromDynVal, + { let ast: SimplExpr = self.ast_required(&key)?; Ok(ast .eval_no_vars() .map_err(|err| AttrError::EvaluationError(ast.span().into(), err))? .read_as() - .map_err(|_| AttrError::AttrTypeError(ast.span().into(), AttrName(key.to_string())))?) + .map_err(|e| AttrError::Other(ast.span().into(), Box::new(e)))?) } - pub fn primitive_optional(&mut self, key: &str) -> Result, AstError> { + pub fn primitive_optional(&mut self, key: &str) -> Result, AstError> + where + E: std::error::Error + 'static, + T: FromDynVal, + { let ast: SimplExpr = match self.ast_optional(key)? { Some(ast) => ast, None => return Ok(None), @@ -102,7 +110,7 @@ impl Attributes { ast.eval_no_vars() .map_err(|err| AttrError::EvaluationError(ast.span().into(), err))? .read_as() - .map_err(|_| AttrError::AttrTypeError(ast.span().into(), AttrName(key.to_string())))?, + .map_err(|e| AttrError::Other(ast.span().into(), Box::new(e)))?, )) }