rpm-nvr-0.1.0: src/Data/RPM/NVR.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 name-version-release of an RPM package
module Data.RPM.NVR (
NVR(..),
showNVR,
readNVR,
eitherNVR,
maybeNVR,
VerRel(..),
)
where
import Data.Either.Extra
import Data.List.Extra
import Data.RPM.VerRel
-- | An rpm package name-version-release
data NVR = NVR String VerRel
deriving Eq
-- | render an name-version-release
showNVR :: NVR -> String
showNVR (NVR nm verrel) = nm ++ "-" ++ showVerRel verrel
-- | Either read a package name-version-release or return a failure string
eitherNVR :: String -> Either String NVR
eitherNVR s =
case reverse (splitOn "-" s) of
rel:ver:emaN ->
if any null (rel:ver:emaN)
then Left $ "NVR cannot start or end with '-'s: " ++ s
else Right (NVR (intercalate "-" $ reverse emaN) (VerRel ver rel))
_ ->
Left $ "malformed NVR string: '" ++ s ++ "'"
-- | Maybe read a package name-version-release string
maybeNVR :: String -> Maybe NVR
maybeNVR = eitherToMaybe . eitherNVR
-- | read an NVR
--
-- Errors if not of the form "name-version-release"
readNVR :: String -> NVR
readNVR = either error id . eitherNVR