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 |