diff options
author | Nadrieril | 2019-05-06 23:17:26 +0200 |
---|---|---|
committer | Nadrieril | 2019-05-06 23:20:47 +0200 |
commit | 60129b7d1c0ea8bdf2ec666fa51957e97465e88f (patch) | |
tree | 2118155537989a1a3bfa6c51b5c476651a0ef93e /dhall/src/error | |
parent | 423fdeebe9247b16744fae4b50df415bbd08be04 (diff) |
Consolidate errors in the error module
Diffstat (limited to '')
-rw-r--r-- | dhall/src/error.rs | 60 | ||||
-rw-r--r-- | dhall/src/error/mod.rs | 169 | ||||
-rw-r--r-- | dhall/src/error/text/AnnotMismatch.txt (renamed from dhall/src/errors/AnnotMismatch.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/CantTextAppend.txt (renamed from dhall/src/errors/CantTextAppend.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/DuplicateAlternative.txt (renamed from dhall/src/errors/DuplicateAlternative.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/FieldCollision.txt (renamed from dhall/src/errors/FieldCollision.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/HandlerInputTypeMismatch.txt (renamed from dhall/src/errors/HandlerInputTypeMismatch.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/HandlerNotAFunction.txt (renamed from dhall/src/errors/HandlerNotAFunction.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/HandlerOutputTypeMismatch.txt (renamed from dhall/src/errors/HandlerOutputTypeMismatch.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/IfBranchMismatch.txt (renamed from dhall/src/errors/IfBranchMismatch.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/IfBranchMustBeTerm.txt (renamed from dhall/src/errors/IfBranchMustBeTerm.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/InvalidAlterantive.txt (renamed from dhall/src/errors/InvalidAlterantive.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/InvalidAlterantiveType.txt (renamed from dhall/src/errors/InvalidAlterantiveType.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/InvalidField.txt (renamed from dhall/src/errors/InvalidField.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/InvalidFieldType.txt (renamed from dhall/src/errors/InvalidFieldType.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/InvalidInputType.txt (renamed from dhall/src/errors/InvalidInputType.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/InvalidListElement.txt (renamed from dhall/src/errors/InvalidListElement.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/InvalidListType.txt (renamed from dhall/src/errors/InvalidListType.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/InvalidOptionType.txt (renamed from dhall/src/errors/InvalidOptionType.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/InvalidOptionalElement.txt (renamed from dhall/src/errors/InvalidOptionalElement.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/InvalidOptionalLiteral.txt (renamed from dhall/src/errors/InvalidOptionalLiteral.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/InvalidOutputType.txt (renamed from dhall/src/errors/InvalidOutputType.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/InvalidPredicate.txt (renamed from dhall/src/errors/InvalidPredicate.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/MissingField.txt (renamed from dhall/src/errors/MissingField.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/MissingHandler.txt (renamed from dhall/src/errors/MissingHandler.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/MustCombineARecord.txt (renamed from dhall/src/errors/MustCombineARecord.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/MustMergeARecord.txt (renamed from dhall/src/errors/MustMergeARecord.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/MustMergeUnion.txt (renamed from dhall/src/errors/MustMergeUnion.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/NoDependentLet.txt (renamed from dhall/src/errors/NoDependentLet.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/NoDependentTypes.txt (renamed from dhall/src/errors/NoDependentTypes.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/NotAFunction.txt (renamed from dhall/src/errors/NotAFunction.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/NotARecord.txt (renamed from dhall/src/errors/NotARecord.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/TypeMismatch.txt (renamed from dhall/src/errors/TypeMismatch.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/UnboundVariable.txt (renamed from dhall/src/errors/UnboundVariable.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/Untyped.txt (renamed from dhall/src/errors/Untyped.txt) | 0 | ||||
-rw-r--r-- | dhall/src/error/text/UnusedHandler.txt (renamed from dhall/src/errors/UnusedHandler.txt) | 0 |
36 files changed, 169 insertions, 60 deletions
diff --git a/dhall/src/error.rs b/dhall/src/error.rs deleted file mode 100644 index 8497a91..0000000 --- a/dhall/src/error.rs +++ /dev/null @@ -1,60 +0,0 @@ -use std::io::Error as IOError; - -use dhall_syntax::ParseError; - -use crate::phase::binary::DecodeError; -use crate::phase::resolve::ImportError; -use crate::phase::typecheck::TypeError; - -pub type Result<T> = std::result::Result<T, Error>; - -#[derive(Debug)] -#[non_exhaustive] -pub enum Error { - IO(IOError), - Parse(ParseError), - Decode(DecodeError), - Resolve(ImportError), - Typecheck(TypeError), - Deserialize(String), -} - -impl std::fmt::Display for Error { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - match self { - Error::IO(err) => write!(f, "{}", err), - Error::Parse(err) => write!(f, "{}", err), - Error::Decode(err) => write!(f, "{:?}", err), - Error::Resolve(err) => write!(f, "{:?}", err), - Error::Typecheck(err) => write!(f, "{:?}", err), - Error::Deserialize(err) => write!(f, "{}", err), - } - } -} - -impl std::error::Error for Error {} -impl From<IOError> for Error { - fn from(err: IOError) -> Error { - Error::IO(err) - } -} -impl From<ParseError> for Error { - fn from(err: ParseError) -> Error { - Error::Parse(err) - } -} -impl From<DecodeError> for Error { - fn from(err: DecodeError) -> Error { - Error::Decode(err) - } -} -impl From<ImportError> for Error { - fn from(err: ImportError) -> Error { - Error::Resolve(err) - } -} -impl From<TypeError> for Error { - fn from(err: TypeError) -> Error { - Error::Typecheck(err) - } -} diff --git a/dhall/src/error/mod.rs b/dhall/src/error/mod.rs new file mode 100644 index 0000000..e70b9a9 --- /dev/null +++ b/dhall/src/error/mod.rs @@ -0,0 +1,169 @@ +use std::io::Error as IOError; + +use dhall_syntax::{BinOp, Import, Label, ParseError, V}; + +use crate::phase::resolve::ImportStack; +use crate::phase::typecheck::TypecheckContext; +use crate::phase::{Normalized, Type, Typed}; + +pub type Result<T> = std::result::Result<T, Error>; + +#[derive(Debug)] +#[non_exhaustive] +pub enum Error { + IO(IOError), + Parse(ParseError), + Decode(DecodeError), + Resolve(ImportError), + Typecheck(TypeError), + Deserialize(String), +} + +#[derive(Debug)] +pub enum ImportError { + Recursive(Import, Box<Error>), + UnexpectedImport(Import), + ImportCycle(ImportStack, Import), +} + +#[derive(Debug)] +pub enum DecodeError { + CBORError(serde_cbor::error::Error), + WrongFormatError(String), +} + +/// A structured type error that includes context +#[derive(Debug)] +pub struct TypeError { + type_message: TypeMessage, + context: TypecheckContext, +} + +/// The specific type error +#[derive(Debug)] +pub(crate) enum TypeMessage { + UnboundVariable(V<Label>), + InvalidInputType(Normalized), + InvalidOutputType(Normalized), + NotAFunction(Typed), + TypeMismatch(Typed, Normalized, Typed), + AnnotMismatch(Typed, Normalized), + Untyped, + InvalidListElement(usize, Normalized, Typed), + InvalidListType(Normalized), + InvalidOptionalType(Normalized), + InvalidPredicate(Typed), + IfBranchMismatch(Typed, Typed), + IfBranchMustBeTerm(bool, Typed), + InvalidFieldType(Label, Type), + NotARecord(Label, Normalized), + MissingRecordField(Label, Typed), + MissingUnionField(Label, Normalized), + BinOpTypeMismatch(BinOp, Typed), + NoDependentTypes(Normalized, Normalized), + InvalidTextInterpolation(Typed), + Sort, + Unimplemented, +} + +impl TypeError { + pub(crate) fn new( + context: &TypecheckContext, + type_message: TypeMessage, + ) -> Self { + TypeError { + context: context.clone(), + type_message, + } + } +} + +impl From<TypeError> for std::option::NoneError { + fn from(_: TypeError) -> std::option::NoneError { + std::option::NoneError + } +} + +impl std::error::Error for TypeMessage { + fn description(&self) -> &str { + use TypeMessage::*; + match *self { + // UnboundVariable => "Unbound variable", + InvalidInputType(_) => "Invalid function input", + InvalidOutputType(_) => "Invalid function output", + NotAFunction(_) => "Not a function", + TypeMismatch(_, _, _) => "Wrong type of function argument", + _ => "Unhandled error", + } + } +} + +impl std::fmt::Display for TypeMessage { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + match self { + // UnboundVariable(_) => { + // f.write_str(include_str!("errors/UnboundVariable.txt")) + // } + // TypeMismatch(e0, e1, e2) => { + // let template = include_str!("errors/TypeMismatch.txt"); + // let s = template + // .replace("$txt0", &format!("{}", e0.as_expr())) + // .replace("$txt1", &format!("{}", e1.as_expr())) + // .replace("$txt2", &format!("{}", e2.as_expr())) + // .replace( + // "$txt3", + // &format!( + // "{}", + // e2.get_type() + // .unwrap() + // .as_normalized() + // .unwrap() + // .as_expr() + // ), + // ); + // f.write_str(&s) + // } + _ => f.write_str("Unhandled error message"), + } + } +} + +impl std::fmt::Display for Error { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + match self { + Error::IO(err) => write!(f, "{}", err), + Error::Parse(err) => write!(f, "{}", err), + Error::Decode(err) => write!(f, "{:?}", err), + Error::Resolve(err) => write!(f, "{:?}", err), + Error::Typecheck(err) => write!(f, "{:?}", err), + Error::Deserialize(err) => write!(f, "{}", err), + } + } +} + +impl std::error::Error for Error {} +impl From<IOError> for Error { + fn from(err: IOError) -> Error { + Error::IO(err) + } +} +impl From<ParseError> for Error { + fn from(err: ParseError) -> Error { + Error::Parse(err) + } +} +impl From<DecodeError> for Error { + fn from(err: DecodeError) -> Error { + Error::Decode(err) + } +} +impl From<ImportError> for Error { + fn from(err: ImportError) -> Error { + Error::Resolve(err) + } +} +impl From<TypeError> for Error { + fn from(err: TypeError) -> Error { + Error::Typecheck(err) + } +} diff --git a/dhall/src/errors/AnnotMismatch.txt b/dhall/src/error/text/AnnotMismatch.txt index 4904bf8..4904bf8 100644 --- a/dhall/src/errors/AnnotMismatch.txt +++ b/dhall/src/error/text/AnnotMismatch.txt diff --git a/dhall/src/errors/CantTextAppend.txt b/dhall/src/error/text/CantTextAppend.txt index 26b9ceb..26b9ceb 100644 --- a/dhall/src/errors/CantTextAppend.txt +++ b/dhall/src/error/text/CantTextAppend.txt diff --git a/dhall/src/errors/DuplicateAlternative.txt b/dhall/src/error/text/DuplicateAlternative.txt index 077f8aa..077f8aa 100644 --- a/dhall/src/errors/DuplicateAlternative.txt +++ b/dhall/src/error/text/DuplicateAlternative.txt diff --git a/dhall/src/errors/FieldCollision.txt b/dhall/src/error/text/FieldCollision.txt index 2b2d260..2b2d260 100644 --- a/dhall/src/errors/FieldCollision.txt +++ b/dhall/src/error/text/FieldCollision.txt diff --git a/dhall/src/errors/HandlerInputTypeMismatch.txt b/dhall/src/error/text/HandlerInputTypeMismatch.txt index 7d3525b..7d3525b 100644 --- a/dhall/src/errors/HandlerInputTypeMismatch.txt +++ b/dhall/src/error/text/HandlerInputTypeMismatch.txt diff --git a/dhall/src/errors/HandlerNotAFunction.txt b/dhall/src/error/text/HandlerNotAFunction.txt index ff87443..ff87443 100644 --- a/dhall/src/errors/HandlerNotAFunction.txt +++ b/dhall/src/error/text/HandlerNotAFunction.txt diff --git a/dhall/src/errors/HandlerOutputTypeMismatch.txt b/dhall/src/error/text/HandlerOutputTypeMismatch.txt index f359459..f359459 100644 --- a/dhall/src/errors/HandlerOutputTypeMismatch.txt +++ b/dhall/src/error/text/HandlerOutputTypeMismatch.txt diff --git a/dhall/src/errors/IfBranchMismatch.txt b/dhall/src/error/text/IfBranchMismatch.txt index a95b130..a95b130 100644 --- a/dhall/src/errors/IfBranchMismatch.txt +++ b/dhall/src/error/text/IfBranchMismatch.txt diff --git a/dhall/src/errors/IfBranchMustBeTerm.txt b/dhall/src/error/text/IfBranchMustBeTerm.txt index 4c15881..4c15881 100644 --- a/dhall/src/errors/IfBranchMustBeTerm.txt +++ b/dhall/src/error/text/IfBranchMustBeTerm.txt diff --git a/dhall/src/errors/InvalidAlterantive.txt b/dhall/src/error/text/InvalidAlterantive.txt index 391fc3a..391fc3a 100644 --- a/dhall/src/errors/InvalidAlterantive.txt +++ b/dhall/src/error/text/InvalidAlterantive.txt diff --git a/dhall/src/errors/InvalidAlterantiveType.txt b/dhall/src/error/text/InvalidAlterantiveType.txt index f5dadef..f5dadef 100644 --- a/dhall/src/errors/InvalidAlterantiveType.txt +++ b/dhall/src/error/text/InvalidAlterantiveType.txt diff --git a/dhall/src/errors/InvalidField.txt b/dhall/src/error/text/InvalidField.txt index bfbf106..bfbf106 100644 --- a/dhall/src/errors/InvalidField.txt +++ b/dhall/src/error/text/InvalidField.txt diff --git a/dhall/src/errors/InvalidFieldType.txt b/dhall/src/error/text/InvalidFieldType.txt index 4f76a64..4f76a64 100644 --- a/dhall/src/errors/InvalidFieldType.txt +++ b/dhall/src/error/text/InvalidFieldType.txt diff --git a/dhall/src/errors/InvalidInputType.txt b/dhall/src/error/text/InvalidInputType.txt index eabafa4..eabafa4 100644 --- a/dhall/src/errors/InvalidInputType.txt +++ b/dhall/src/error/text/InvalidInputType.txt diff --git a/dhall/src/errors/InvalidListElement.txt b/dhall/src/error/text/InvalidListElement.txt index 59db7b7..59db7b7 100644 --- a/dhall/src/errors/InvalidListElement.txt +++ b/dhall/src/error/text/InvalidListElement.txt diff --git a/dhall/src/errors/InvalidListType.txt b/dhall/src/error/text/InvalidListType.txt index 676647e..676647e 100644 --- a/dhall/src/errors/InvalidListType.txt +++ b/dhall/src/error/text/InvalidListType.txt diff --git a/dhall/src/errors/InvalidOptionType.txt b/dhall/src/error/text/InvalidOptionType.txt index 3bc81de..3bc81de 100644 --- a/dhall/src/errors/InvalidOptionType.txt +++ b/dhall/src/error/text/InvalidOptionType.txt diff --git a/dhall/src/errors/InvalidOptionalElement.txt b/dhall/src/error/text/InvalidOptionalElement.txt index 0254220..0254220 100644 --- a/dhall/src/errors/InvalidOptionalElement.txt +++ b/dhall/src/error/text/InvalidOptionalElement.txt diff --git a/dhall/src/errors/InvalidOptionalLiteral.txt b/dhall/src/error/text/InvalidOptionalLiteral.txt index 41c0fdc..41c0fdc 100644 --- a/dhall/src/errors/InvalidOptionalLiteral.txt +++ b/dhall/src/error/text/InvalidOptionalLiteral.txt diff --git a/dhall/src/errors/InvalidOutputType.txt b/dhall/src/error/text/InvalidOutputType.txt index dd2695d..dd2695d 100644 --- a/dhall/src/errors/InvalidOutputType.txt +++ b/dhall/src/error/text/InvalidOutputType.txt diff --git a/dhall/src/errors/InvalidPredicate.txt b/dhall/src/error/text/InvalidPredicate.txt index 4c15881..4c15881 100644 --- a/dhall/src/errors/InvalidPredicate.txt +++ b/dhall/src/error/text/InvalidPredicate.txt diff --git a/dhall/src/errors/MissingField.txt b/dhall/src/error/text/MissingField.txt index de14a33..de14a33 100644 --- a/dhall/src/errors/MissingField.txt +++ b/dhall/src/error/text/MissingField.txt diff --git a/dhall/src/errors/MissingHandler.txt b/dhall/src/error/text/MissingHandler.txt index 433445e..433445e 100644 --- a/dhall/src/errors/MissingHandler.txt +++ b/dhall/src/error/text/MissingHandler.txt diff --git a/dhall/src/errors/MustCombineARecord.txt b/dhall/src/error/text/MustCombineARecord.txt index 141b969..141b969 100644 --- a/dhall/src/errors/MustCombineARecord.txt +++ b/dhall/src/error/text/MustCombineARecord.txt diff --git a/dhall/src/errors/MustMergeARecord.txt b/dhall/src/error/text/MustMergeARecord.txt index 79094bd..79094bd 100644 --- a/dhall/src/errors/MustMergeARecord.txt +++ b/dhall/src/error/text/MustMergeARecord.txt diff --git a/dhall/src/errors/MustMergeUnion.txt b/dhall/src/error/text/MustMergeUnion.txt index 68df70c..68df70c 100644 --- a/dhall/src/errors/MustMergeUnion.txt +++ b/dhall/src/error/text/MustMergeUnion.txt diff --git a/dhall/src/errors/NoDependentLet.txt b/dhall/src/error/text/NoDependentLet.txt index fdc65b4..fdc65b4 100644 --- a/dhall/src/errors/NoDependentLet.txt +++ b/dhall/src/error/text/NoDependentLet.txt diff --git a/dhall/src/errors/NoDependentTypes.txt b/dhall/src/error/text/NoDependentTypes.txt index 435bdcb..435bdcb 100644 --- a/dhall/src/errors/NoDependentTypes.txt +++ b/dhall/src/error/text/NoDependentTypes.txt diff --git a/dhall/src/errors/NotAFunction.txt b/dhall/src/error/text/NotAFunction.txt index dd2695d..dd2695d 100644 --- a/dhall/src/errors/NotAFunction.txt +++ b/dhall/src/error/text/NotAFunction.txt diff --git a/dhall/src/errors/NotARecord.txt b/dhall/src/error/text/NotARecord.txt index e0eebc8..e0eebc8 100644 --- a/dhall/src/errors/NotARecord.txt +++ b/dhall/src/error/text/NotARecord.txt diff --git a/dhall/src/errors/TypeMismatch.txt b/dhall/src/error/text/TypeMismatch.txt index 4904bf8..4904bf8 100644 --- a/dhall/src/errors/TypeMismatch.txt +++ b/dhall/src/error/text/TypeMismatch.txt diff --git a/dhall/src/errors/UnboundVariable.txt b/dhall/src/error/text/UnboundVariable.txt index bd7d483..bd7d483 100644 --- a/dhall/src/errors/UnboundVariable.txt +++ b/dhall/src/error/text/UnboundVariable.txt diff --git a/dhall/src/errors/Untyped.txt b/dhall/src/error/text/Untyped.txt index 4904bf8..4904bf8 100644 --- a/dhall/src/errors/Untyped.txt +++ b/dhall/src/error/text/Untyped.txt diff --git a/dhall/src/errors/UnusedHandler.txt b/dhall/src/error/text/UnusedHandler.txt index 2e46a12..2e46a12 100644 --- a/dhall/src/errors/UnusedHandler.txt +++ b/dhall/src/error/text/UnusedHandler.txt |