| Line No. | Rev | Author | Line |
|---|---|---|---|
| 1 | 1 | paulosilva | |
| 2 | 7 | paulosilva | {-# LANGUAGE FlexibleContexts, MultiParamTypeClasses, FlexibleInstances #-} |
| 3 | 1 | paulosilva | {-# OPTIONS_GHC -Wall #-} |
| 4 | |||
| 5 | ------------------------------------------------------------------------------- | ||
| 6 | |||
| 7 | {- | | ||
| 8 | Module : Control.GalcError | ||
| 9 | Description : Error messages of Galculator. | ||
| 10 | Copyright : (c) Paulo Silva | ||
| 11 | License : LGPL | ||
| 12 | |||
| 13 | Maintainer : paufil@di.uminho.pt | ||
| 14 | Stability : experimental | ||
| 15 | Portability : portable | ||
| 16 | |||
| 17 | -} | ||
| 18 | |||
| 19 | ------------------------------------------------------------------------------- | ||
| 20 | |||
| 21 | module Control.GalcError ( | ||
| 22 | GalcError(..), | ||
| 23 | maybe2error, | ||
| 24 | list2error, | ||
| 25 | either2error, | ||
| 26 | ) where | ||
| 27 | |||
| 28 | 7 | paulosilva | import Control.MonadOr |
| 29 | 1 | paulosilva | import Control.Monad.Error |
| 30 | |||
| 31 | ------------------------------------------------------------------------------- | ||
| 32 | |||
| 33 | data GalcError = | ||
| 34 | UnknownError | ||
| 35 | | NoValueError | ||
| 36 | | ImpossibleError | ||
| 37 | | CustomError String | ||
| 38 | | ParsingError String | ||
| 39 | | UnificationError (String, String) | ||
| 40 | | CastingError (String, String) | ||
| 41 | | InferenceError GalcError String | ||
| 42 | | ReferenceError String | ||
| 43 | | MultiDefError String | ||
| 44 | | ModuleFileError String | ||
| 45 | | ModuleRefError String | ||
| 46 | | DerivationError | ||
| 47 | | ModeError | ||
| 48 | | NoProofError | ||
| 49 | | ExistingRefError String | ||
| 50 | | QedError String String | ||
| 51 | | NoOrderSetError | ||
| 52 | 7 | paulosilva | | RewriteError String |
| 53 | | EqualityError | ||
| 54 | | NestedError GalcError | ||
| 55 | | DecomposeError String String | ||
| 56 | 1 | paulosilva | |
| 57 | ------------------------------------------------------------------------------- | ||
| 58 | |||
| 59 | instance Show GalcError where | ||
| 60 | show = showGalcError | ||
| 61 | |||
| 62 | ------------------------------------------------------------------------------- | ||
| 63 | |||
| 64 | instance Error GalcError where | ||
| 65 | noMsg = UnknownError | ||
| 66 | strMsg = CustomError | ||
| 67 | |||
| 68 | ------------------------------------------------------------------------------- | ||
| 69 | |||
| 70 | instance MonadError GalcError [] where | ||
| 71 | throwError _ = [] | ||
| 72 | catchError [] f = f NoValueError | ||
| 73 | catchError x@(_:_) _ = x | ||
| 74 | |||
| 75 | ------------------------------------------------------------------------------- | ||
| 76 | |||
| 77 | 7 | paulosilva | instance MonadOr (Either GalcError) where |
| 78 | morelse (Left _) b = b | ||
| 79 | morelse a _ = a | ||
| 80 | |||
| 81 | ------------------------------------------------------------------------------- | ||
| 82 | |||
| 83 | 1 | paulosilva | maybe2error :: MonadError GalcError m => GalcError -> Maybe a -> m a |
| 84 | maybe2error e Nothing = throwError e | ||
| 85 | maybe2error _ (Just a) = return a | ||
| 86 | |||
| 87 | ------------------------------------------------------------------------------- | ||
| 88 | |||
| 89 | list2error :: MonadError GalcError m => GalcError -> [a] -> m a | ||
| 90 | list2error e [] = throwError e | ||
| 91 | list2error _ (x:_) = return x | ||
| 92 | |||
| 93 | ------------------------------------------------------------------------------- | ||
| 94 | |||
| 95 | either2error :: (Show e, MonadError GalcError m) | ||
| 96 | => (e -> GalcError) -> Either e a -> m a | ||
| 97 | either2error f (Left e) = throwError $ f e | ||
| 98 | either2error _ (Right v) = return v | ||
| 99 | |||
| 100 | ------------------------------------------------------------------------------- | ||
| 101 | |||
| 102 | showGalcError :: GalcError -> String | ||
| 103 | 7 | paulosilva | showGalcError UnknownError = |
| 104 | "Unknown error!" | ||
| 105 | showGalcError NoValueError = | ||
| 106 | "No values found" | ||
| 107 | showGalcError ImpossibleError = | ||
| 108 | "The impossible has happened!" | ||
| 109 | 1 | paulosilva | showGalcError (CustomError err) = err |
| 110 | 7 | paulosilva | showGalcError (ParsingError err) = |
| 111 | "Parsing error:\n" ++ err | ||
| 112 | 1 | paulosilva | showGalcError (UnificationError (s1, s2)) = |
| 113 | "Unification error\nCannot unify " ++ s1 ++ " and " ++ s2 | ||
| 114 | showGalcError (CastingError (s1, s2)) = | ||
| 115 | "Cannot cast " ++ s1 ++ " to " ++ s2 | ||
| 116 | showGalcError (InferenceError err s) = | ||
| 117 | 7 | paulosilva | "Error in type inference:\n" ++ showGalcError err ++ "\n" ++ s |
| 118 | 1 | paulosilva | showGalcError (ReferenceError err) = |
| 119 | "Invalid reference: " ++ err | ||
| 120 | showGalcError (MultiDefError err) = | ||
| 121 | "Multiple definitions: " ++ err | ||
| 122 | 7 | paulosilva | showGalcError (ModuleFileError err) = |
| 123 | "Error opening file: " ++ err ++ ".gal" | ||
| 124 | showGalcError DerivationError = | ||
| 125 | "Inversion not expected" | ||
| 126 | showGalcError ModeError = | ||
| 127 | "Command not available in this mode" | ||
| 128 | showGalcError (ModuleRefError err) = | ||
| 129 | "Invalide module name: " ++ err | ||
| 130 | showGalcError NoProofError = | ||
| 131 | "Currently there is no proof" | ||
| 132 | showGalcError (ExistingRefError err) = | ||
| 133 | "Existing reference: " ++ err | ||
| 134 | showGalcError (QedError s1 s2) = | ||
| 135 | "Cannot equalize: " ++ s1 ++ " and " ++ s2 | ||
| 136 | showGalcError (NoOrderSetError) = | ||
| 137 | "No order currently set" | ||
| 138 | showGalcError (RewriteError s) = | ||
| 139 | "Cannot rewrite: " ++ s | ||
| 140 | showGalcError EqualityError = | ||
| 141 | "Types are not equal" | ||
| 142 | showGalcError (NestedError e) = | ||
| 143 | showGalcError e | ||
| 144 | showGalcError (DecomposeError s1 s2) = | ||
| 145 | "Cannot match types: " ++ s1 ++ " and " ++ s2 | ||
| 146 | 1 | paulosilva | ------------------------------------------------------------------------------- |
| 147 |