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