packages feed

rpm-nvr-0.1.2: 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 {nvrName :: String,
                nvrVerRel :: 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 null rel || null ver || null 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