module Codec.GHC.Log where
import Data.Attoparsec.Text
import Data.Text (Text)
data Message = Message Text Pos Level [Text]
deriving Show
data Pos = Pos { column :: Int, line :: Int }
deriving Show
data Level = Warning | Error
deriving Show
messageParser :: Parser Message
messageParser = do
fp <- takeWhile1 (\c -> c /= sepChar && c /= '\n' && c /= '\r') <* char sepChar
n <- decimal <* char sepChar
c <- decimal <* char sepChar
l <- choice
[ string " Warning:" *> return Warning
, return Error ]
txt <- choice
[ return <$> untilLineBreak <* ("\n" <* end)
, takeLineBreak *> (multilinesComment <* end) ]
return $ Message fp (Pos c n) l txt
where
multilinesComment = many1 $ (" " *> (untilLineBreak <* "\n"))
untilLineBreak = takeWhile1 $ \w -> w /= '\n' && w /= '\r'
takeLineBreak = takeWhile1 $ \w -> w == '\n' || w == '\r'
end = choice [const () <$> "\n", endOfInput, return ()]
sepChar = ':'