{-# LANGUAGE OverloadedStrings #-} module Bunyan.Log where import Data.Monoid ((<>)) import qualified Data.Text as T import qualified Data.Sequence as S data Entry = Entry { logCommit :: T.Text , logAuthor :: T.Text , logDate :: T.Text , logMessage :: S.Seq T.Text } deriving (Eq, Show) emptyLogEntry :: T.Text -> Entry emptyLogEntry commit = Entry { logCommit = commit , logAuthor = "" , logDate = "" , logMessage = mempty } parseLogEntry :: T.Text -> S.Seq Entry parseLogEntry = getNextCommit . T.lines where getNextCommit [] = S.empty getNextCommit (x:xs) | Just cmt <- T.stripPrefix "commit " x = parseCommit (emptyLogEntry cmt) xs | otherwise = getNextCommit xs parseCommit entry [] = S.singleton entry parseCommit entry (x:xs) | Just cmt <- T.stripPrefix "commit " x = entry S.<| parseCommit (emptyLogEntry cmt) xs | Just author <- T.stripPrefix "Author:" x = parseCommit (entry { logAuthor = T.strip author }) xs | Just date <- T.stripPrefix "Date:" x = parseCommit (entry { logDate = T.strip date }) xs | Just line <- T.stripPrefix " " x = parseCommit (entry { logMessage = logMessage entry <> S.singleton line }) xs | otherwise = parseCommit entry xs