rpm-nvr-0.1.0: src/Data/RPM/VerRel.hs
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 2 of the License, or
-- (at your option) any later version.
-- | A type for carrying the version and release of an rpm package.
module Data.RPM.VerRel (
VerRel(..),
showVerRel,
readVerRel,
eitherVerRel,
maybeVerRel
)
where
import Data.Either.Extra
import Data.List.Extra
import Data.RPM.VerCmp
-- | The version-release of an (rpm) package, which is ordered by
-- @rpmVerCompare@ for version and release.
--
-- FIXME: note currently rpmVerCompare is not used for Eq (like codec-rpm).
data VerRel = VerRel String String
deriving (Eq)
-- | Display a VerRel
showVerRel :: VerRel -> String
showVerRel (VerRel ver rel) = ver ++ "-" ++ rel
-- | Either read a package version-release or return an failure string
eitherVerRel :: String -> Either String VerRel
eitherVerRel s =
case stripInfixEnd "-" s of
Just (v,r) ->
if null v || null r
then error $ "VerRel cannot start or end with '-': " ++ s
else Right (VerRel v r)
Nothing -> Left $ "VerRel must contain a '-': " ++ s
-- | Maybe read a package version-release
maybeVerRel :: String -> Maybe VerRel
maybeVerRel = eitherToMaybe . eitherVerRel
-- | Read a version-release
--
-- Errors if malformed
readVerRel :: String -> VerRel
readVerRel = either error id . eitherVerRel
instance Ord VerRel where
compare (VerRel v1 r1) (VerRel v2 r2) =
case rpmVerCompare v1 v2 of
EQ -> rpmVerCompare r1 r2
o -> o
-- appendRelease :: VerRel -> String -> VerRel
-- appendRelease (VerRel v r) d = VerRel v (r ++ d)