aboutsummaryrefslogtreecommitdiffstats
path: root/app/Patch.hs
blob: f1c547a281de21273134fcf8ae6e08755078470b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
module Patch
  ( Patch,
    parse,
    render,
  )
where

import Control.Exception (throw)
import Data.Text qualified as T
import Exception qualified as E
import Prettyprinter (pretty)
import Prettyprinter qualified as P
import Prettyprinter.Render.Terminal qualified as P
import Text.Diff.Parse qualified as D
import Text.Diff.Parse.Types qualified as D

newtype Patch = Patch
  { fileDeltas :: D.FileDeltas
  }
  deriving (Show)

parse :: T.Text -> Patch
parse = either (throw . E.InvalidDiff) Patch . D.parseDiff

render :: Patch -> P.Doc P.AnsiStyle
render (Patch {..}) =
  P.vsep $ map prettyFileDelta fileDeltas
  where
    prettyFileDelta (D.FileDelta {..}) = prettyContent fileDeltaContent
    prettyContent D.Binary = P.emptyDoc
    prettyContent (D.Hunks hunks) = P.vsep (map prettyHunk hunks)
    prettyHunk (D.Hunk {..}) = P.vsep $ map prettyLine hunkLines
    prettyLine (D.Line {..}) =
      case lineAnnotation of
        D.Added -> P.annotate (P.color P.Green) $ P.pretty ("+" :: T.Text) <> pretty lineContent
        D.Removed -> P.annotate (P.color P.Red) $ P.pretty ("-" :: T.Text) <> pretty lineContent
        D.Context -> P.annotate (P.color P.White) $ P.pretty (" " :: T.Text) <> pretty lineContent