on ae7e6bd help sign in
elk/src/Reporting/Error.hs
78 lines 1.9 kB history raw
1{-# LANGUAGE OverloadedStrings #-}
2module Reporting.Error where
4import Data.Aeson ((.=))
5import qualified Data.Aeson as Json
6import qualified Data.ByteString.Lazy.Char8 as BS
8import qualified Reporting.Annotation as A
9import qualified Reporting.Error.Canonicalize as Canonicalize
10import qualified Reporting.Error.Syntax as Syntax
11import qualified Reporting.Error.Type as Type
12import qualified Reporting.Region as R
15-- ALL POSSIBLE ERRORS
17data Error
18 = Syntax Syntax.Error
19 | Canonicalize Canonicalize.Error
20 | Type Type.Error
23-- TO STRING
25toString :: String -> String -> A.Located Error -> String
26toString location source (A.A region err) =
27 let
28 (tag, hint) =
29 case err of
30 Syntax syntaxError ->
31 ( "SYNTAX ERROR"
32 , Syntax.toHint syntaxError
33 )
35 Canonicalize canonicalizeError ->
36 ( "NAMING ERROR"
37 , Canonicalize.toHint canonicalizeError
38 )
40 Type typeError ->
41 ( "TYPE ERROR"
42 , Type.toHint typeError
43 )
45 usedSpace =
46 4 + length tag + 1 + length location
48 messageBar =
49 "-- " ++ tag ++ " "
50 ++ replicate (max 1 (80 - usedSpace)) '-'
51 ++ " " ++ location
52 in
53 messageBar ++ "\n\n"
54 ++ R.select region source ++ "\n"
55 ++ hint ++ "\n\n\n"
58-- JSON
60toJson :: A.Located Error -> String
61toJson (A.A region err) =
62 let json =
63 case err of
64 Syntax syntaxError ->
65 Syntax.toJson syntaxError
67 Canonicalize canonicalizeError ->
68 Canonicalize.toJson canonicalizeError
70 Type typeError ->
71 Type.toJson typeError
72 in
73 BS.unpack $ Json.encode $
74 Json.object
75 [ "tag" .= ("error" :: String)
76 , "region" .= region
77 , "error" .= json
78 ]