module Error.Report
(module Text.Pretty
,Error (..)
,ErrorReport (..)
,new_error
,empty_error
,error_line
,error_lines
,error_section
,error_join
,broken)
where
import Text.Pretty
import Data.List
import Data.Typeable
import Text.Parsec
import Control.Exception.Extensible
data Error =
forall p . Pretty p => PrettyError p
| ErrorMessage [Error]
| NoRaise [Error]
deriving (Typeable)
instance Show Error where
show = pretty
instance Exception Error
instance Pretty Error where
pretty' ce i =
case ce of
PrettyError p -> pretty' p i
ErrorMessage ces ->
foldr (.) id $ (map (flip pretty' (i + 1))) ces
NoRaise ces ->
foldr (.) id $ (map (flip pretty' i)) ces
class ErrorReport err where
report :: err -> Error
instance ErrorReport String where
report = new_error
instance ErrorReport ParseError where
report pe = error_lines (lines $ show pe) empty_error
error_join :: [Error] -> Error
error_join = NoRaise . intersperse (new_error $ "\n" ++ replicate 50 '-' ++ "\n" )
empty_error :: Error
empty_error = ErrorMessage []
new_error :: Pretty p => p -> Error
new_error p = PrettyError p
error_lines :: Pretty p => [p] -> Error -> Error
error_lines ps ce =
foldr error_line ce ps
error_line :: Pretty p => p -> Error -> Error
error_line p ce =
case ce of
PrettyError _ -> NoRaise [PrettyError p, ce]
ErrorMessage ers -> ErrorMessage $ PrettyError p : ers
NoRaise ers -> NoRaise $ PrettyError p : ers
error_section :: Error -> Error
error_section ce =
ErrorMessage [ErrorMessage [ce]]
broken :: String
-> String
-> String
-> [String]
-> Error
-> a
broken email name soft msg =
error . pretty . error_lines ["BUG ALERT!"
, soft ++ " has broken because of a programming error."
,"Report the following as a bug to " ++ name ++ " at "]
. error_section . error_lines msg