{-# LANGUAGE RecordWildCards #-}

-- | Error types and functions.
module HIndent.Error
  ( ParseError(..)
  , prettyParseError
  ) where

-- | Parse error type with the location.
data ParseError = ParseError
  { ParseError -> Int
errorLine :: Int -- ^ The row of the parse error's location.
  , ParseError -> Int
errorCol :: Int -- ^ The column of the parse error's location.
  , ParseError -> String
errorFile :: FilePath -- ^ The filename HIndent failed to parse.
  } deriving (ParseError -> ParseError -> Bool
(ParseError -> ParseError -> Bool)
-> (ParseError -> ParseError -> Bool) -> Eq ParseError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ParseError -> ParseError -> Bool
== :: ParseError -> ParseError -> Bool
$c/= :: ParseError -> ParseError -> Bool
/= :: ParseError -> ParseError -> Bool
Eq, Eq ParseError
Eq ParseError
-> (ParseError -> ParseError -> Ordering)
-> (ParseError -> ParseError -> Bool)
-> (ParseError -> ParseError -> Bool)
-> (ParseError -> ParseError -> Bool)
-> (ParseError -> ParseError -> Bool)
-> (ParseError -> ParseError -> ParseError)
-> (ParseError -> ParseError -> ParseError)
-> Ord ParseError
ParseError -> ParseError -> Bool
ParseError -> ParseError -> Ordering
ParseError -> ParseError -> ParseError
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: ParseError -> ParseError -> Ordering
compare :: ParseError -> ParseError -> Ordering
$c< :: ParseError -> ParseError -> Bool
< :: ParseError -> ParseError -> Bool
$c<= :: ParseError -> ParseError -> Bool
<= :: ParseError -> ParseError -> Bool
$c> :: ParseError -> ParseError -> Bool
> :: ParseError -> ParseError -> Bool
$c>= :: ParseError -> ParseError -> Bool
>= :: ParseError -> ParseError -> Bool
$cmax :: ParseError -> ParseError -> ParseError
max :: ParseError -> ParseError -> ParseError
$cmin :: ParseError -> ParseError -> ParseError
min :: ParseError -> ParseError -> ParseError
Ord, Int -> ParseError -> ShowS
[ParseError] -> ShowS
ParseError -> String
(Int -> ParseError -> ShowS)
-> (ParseError -> String)
-> ([ParseError] -> ShowS)
-> Show ParseError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ParseError -> ShowS
showsPrec :: Int -> ParseError -> ShowS
$cshow :: ParseError -> String
show :: ParseError -> String
$cshowList :: [ParseError] -> ShowS
showList :: [ParseError] -> ShowS
Show, ReadPrec [ParseError]
ReadPrec ParseError
Int -> ReadS ParseError
ReadS [ParseError]
(Int -> ReadS ParseError)
-> ReadS [ParseError]
-> ReadPrec ParseError
-> ReadPrec [ParseError]
-> Read ParseError
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS ParseError
readsPrec :: Int -> ReadS ParseError
$creadList :: ReadS [ParseError]
readList :: ReadS [ParseError]
$creadPrec :: ReadPrec ParseError
readPrec :: ReadPrec ParseError
$creadListPrec :: ReadPrec [ParseError]
readListPrec :: ReadPrec [ParseError]
Read)

-- | Pretty-print `ParseError`.
prettyParseError :: ParseError -> String
prettyParseError :: ParseError -> String
prettyParseError ParseError {Int
String
errorLine :: ParseError -> Int
errorCol :: ParseError -> Int
errorFile :: ParseError -> String
errorLine :: Int
errorCol :: Int
errorFile :: String
..} =
  String
"Parse failed at ("
    String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
errorLine
    String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
", "
    String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
errorCol
    String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
") in "
    String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
errorFile
    String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"."