seihou-cli-0.6.0.0: src/Seihou/CLI/VersionCompare.hs
module Seihou.CLI.VersionCompare
( OutdatedStatus (..),
OutdatedEntry (..),
CheckStats (..),
compareVersions,
)
where
import Control.Lens ((^.))
import Data.Aeson (ToJSON (..), object, (.=))
import Data.Generics.Labels ()
import Data.Text (Text)
import GHC.Generics (Generic)
import Seihou.Core.Version (parseVersion)
-- | Status of a module with respect to available updates.
data OutdatedStatus
= UpToDate
| OutdatedSt
| Unversioned
| Unreachable
deriving stock (Eq, Show)
-- | A single entry in the outdated report. Shared between the
-- @seihou outdated@ command (which formats them as a table) and
-- @seihou status@ (which folds them into per-row annotations).
data OutdatedEntry = OutdatedEntry
{ moduleName :: !Text,
installedVersion :: !(Maybe Text),
availableVersion :: !(Maybe Text),
status :: !OutdatedStatus
}
deriving stock (Eq, Generic, Show)
instance ToJSON OutdatedEntry where
toJSON e =
object
[ "module" .= (e ^. #moduleName),
"installed" .= (e ^. #installedVersion),
"available" .= (e ^. #availableVersion),
"status" .= statusText (e ^. #status)
]
where
statusText UpToDate = "up to date" :: Text
statusText OutdatedSt = "outdated"
statusText Unversioned = "unversioned"
statusText Unreachable = "unreachable"
-- | Summary statistics for an update check.
data CheckStats = CheckStats
{ checkedCount :: !Int,
skippedNoOrigin :: !Int
}
deriving stock (Eq, Generic, Show)
-- | Compare installed and available version strings.
compareVersions :: Maybe Text -> Maybe Text -> OutdatedStatus
compareVersions (Just instText) (Just availText) =
case (parseVersion instText, parseVersion availText) of
(Just instV, Just availV)
| instV < availV -> OutdatedSt
| otherwise -> UpToDate
_ -> Unversioned -- unparseable version treated as unversioned
compareVersions _ _ = Unversioned