packages feed

elm-package-0.5: src/Diff.hs

module Diff where

import Control.Monad.Error (throwError)

import qualified Catalog
import qualified CommandLine.Helpers as Cmd
import qualified Diff.Compare as Compare
import qualified Diff.Display as Display
import qualified Docs
import qualified Elm.Docs as Docs
import qualified Elm.Package.Description as Desc
import qualified Elm.Package.Name as N
import qualified Elm.Package.Paths as Path
import qualified Elm.Package.Version as V
import qualified Manager


data Range
    = LatestVsActual
    | Since V.Version
    | Between N.Name V.Version V.Version


diff :: Range -> Manager.Manager ()
diff range =
    case range of
        LatestVsActual ->
            do  desc <- Desc.read Path.description
                let name = Desc.name desc
                newDocs <- Docs.generate desc

                maybeVersions <- Catalog.versions name
                latestVersion <-
                    maybe (throwError noVersions) (return . maximum) maybeVersions

                computeDiff name latestVersion newDocs Nothing

        Since version ->
            do  desc <- Desc.read Path.description
                newDocs <- Docs.generate desc
                computeDiff (Desc.name desc) version newDocs Nothing

        Between name old new ->
            do  newDocs <- Catalog.documentation name new
                computeDiff name old newDocs (Just new)


noVersions :: String
noVersions =
    "This package has not been published, there is nothing to diff against!"


computeDiff
    :: N.Name
    -> V.Version
    -> [Docs.Documentation]
    -> Maybe V.Version
    -> Manager.Manager ()
computeDiff name oldVersion newDocs maybeNewVersion =
    do  Cmd.out msg
        changes <- Compare.computeChanges newDocs name oldVersion
        Cmd.out (Display.packageChanges changes)
    where
        msg =
            "Comparing " ++ N.toString name ++ " " ++ V.toString oldVersion ++ " to " ++ newStuff ++ "..."

        newStuff =
            case maybeNewVersion of
                Nothing -> "local changes"
                Just version -> V.toString version