Log.hs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. {-# LANGUAGE OverloadedStrings #-}
  2. module Bunyan.Log where
  3. import Data.Monoid ((<>))
  4. import qualified Data.Text as T
  5. import qualified Data.Sequence as S
  6. data Entry = Entry
  7. { logCommit :: T.Text
  8. , logAuthor :: T.Text
  9. , logDate :: T.Text
  10. , logMessage :: S.Seq T.Text
  11. } deriving (Eq, Show)
  12. emptyLogEntry :: T.Text -> Entry
  13. emptyLogEntry commit = Entry
  14. { logCommit = commit
  15. , logAuthor = ""
  16. , logDate = ""
  17. , logMessage = mempty
  18. }
  19. parseLogEntry :: T.Text -> S.Seq Entry
  20. parseLogEntry = getNextCommit . T.lines
  21. where getNextCommit [] = S.empty
  22. getNextCommit (x:xs)
  23. | Just cmt <- T.stripPrefix "commit " x =
  24. parseCommit (emptyLogEntry cmt) xs
  25. | otherwise = getNextCommit xs
  26. parseCommit entry [] = S.singleton entry
  27. parseCommit entry (x:xs)
  28. | Just cmt <- T.stripPrefix "commit " x =
  29. entry S.<| parseCommit (emptyLogEntry cmt) xs
  30. | Just author <- T.stripPrefix "Author:" x =
  31. parseCommit (entry { logAuthor = T.strip author }) xs
  32. | Just date <- T.stripPrefix "Date:" x =
  33. parseCommit (entry { logDate = T.strip date }) xs
  34. | Just line <- T.stripPrefix " " x =
  35. parseCommit (entry { logMessage = logMessage entry <> S.singleton line }) xs
  36. | otherwise =
  37. parseCommit entry xs