{-# LANGUAGE DeriveGeneric, GeneralizedNewtypeDeriving #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NoImplicitPrelude #-}
module OpenSuse.Types.ChangeLog
( ChangeLog(..), Entry(..)
, parseEntry, parseDashedLine, parseDateAddressLine, parseDescription
)
where
import OpenSuse.Prelude
import OpenSuse.Prelude.Parser as Parse
import qualified OpenSuse.Prelude.PrettyPrinting as Pretty ( )
import OpenSuse.Types.EMailAddress
import Data.Time.Format
newtype ChangeLog = ChangeLog [Entry]
deriving (Show, Eq, Ord, Generic, NFData, Semigroup, Monoid)
instance HasParser ChangeLog where
parser = ChangeLog <$> (parseDashedLine *> many parser)
data Entry = Entry
{ changedAt :: UTCTime
, changedBy :: EMailAddress
, changeDescription :: Text
}
deriving (Show, Eq, Ord, Generic)
instance NFData Entry
instance HasParser Entry where
parser = parseEntry
{-# ANN parseEntry "HLint: ignore Use <$>" #-}
parseEntry :: CharParser st input m Entry
parseEntry = do
(ts,author) <- parseDateAddressLine
parseEmptyLine
txt <- parseDescription
return (Entry ts author (packText txt))
parseDashedLine :: CharParser st input m ()
parseDashedLine = do
_ <- string "------------------------------------------------------------"
skipMany1 (char '-')
_ <- endOfLine
return ()
parseDateAddressLine :: CharParser st input m (UTCTime, EMailAddress)
parseDateAddressLine = do
ts <- many1 (alphaNum <|> oneOf ": ")
_ <- char '-'
addr <- parser
_ <- endOfLine
utct <- parseTimeM True defaultTimeLocale changeLogDateFormat ts
return (utct,addr)
parseEmptyLine :: CharParser st input m ()
parseEmptyLine = skipMany (oneOf " \t") <* endOfLine
parseDescription :: CharParser st input m String
parseDescription = manyTill anyChar (try parseDashedLine <|> eof)
changeLogDateFormat :: String
changeLogDateFormat = "%a %b %e %H:%M:%S %Z %Y"