-- | helpers to work with parsec errors more nicely module Language.SQL.SimpleSQL.Errors (ParseError(..) --,formatError ,convParseError ) where import Text.Parsec (sourceColumn,sourceLine,sourceName,errorPos) import qualified Text.Parsec as P (ParseError) -- | Type to represent parse errors. data ParseError = ParseError {peErrorString :: String -- ^ contains the error message ,peFilename :: FilePath -- ^ filename location for the error ,pePosition :: (Int,Int) -- ^ line number and column number location for the error ,peFormattedError :: String -- ^ formatted error with the position, error -- message and source context } deriving (Eq,Show) convParseError :: String -> P.ParseError -> ParseError convParseError src e = ParseError {peErrorString = show e ,peFilename = sourceName p ,pePosition = (sourceLine p, sourceColumn p) ,peFormattedError = formatError src e} where p = errorPos e {- format the error more nicely: emacs format for positioning, plus context -} formatError :: String -> P.ParseError -> String formatError src e = sourceName p ++ ":" ++ show (sourceLine p) ++ ":" ++ show (sourceColumn p) ++ ":" ++ context ++ show e where context = let lns = take 1 $ drop (sourceLine p - 1) $ lines src in case lns of [x] -> "\n" ++ x ++ "\n" ++ replicate (sourceColumn p - 1) ' ' ++ "^\n" _ -> "" p = errorPos e