module Data.RPM.NV (
NV(..),
showNV,
readNV,
eitherNV,
maybeNV
)
where
import Data.Either.Extra
import Data.List.Extra
data NV = NV {NV -> String
name :: String,
NV -> String
version :: String}
deriving (NV -> NV -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: NV -> NV -> Bool
$c/= :: NV -> NV -> Bool
== :: NV -> NV -> Bool
$c== :: NV -> NV -> Bool
Eq)
showNV :: NV -> String
showNV :: NV -> String
showNV (NV String
nm String
ver) = String
nm forall a. [a] -> [a] -> [a]
++ String
"-" forall a. [a] -> [a] -> [a]
++ String
ver
eitherNV :: String -> Either String NV
eitherNV :: String -> Either String NV
eitherNV String
"" = forall a b. a -> Either a b
Left String
"NV cannot be empty string"
eitherNV String
s =
case forall a. Eq a => [a] -> [a] -> Maybe ([a], [a])
stripInfixEnd String
"-" String
s of
Just (String
n,String
v) ->
if forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
n Bool -> Bool -> Bool
|| forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
v
then forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ String
"NV must not start or end with '-': " forall a. [a] -> [a] -> [a]
++ String
s
else forall a b. b -> Either a b
Right (String -> String -> NV
NV String
n String
v)
Maybe (String, String)
Nothing -> forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ String
"NV must contain '-': " forall a. [a] -> [a] -> [a]
++ String
s
maybeNV :: String -> Maybe NV
maybeNV :: String -> Maybe NV
maybeNV = forall a b. Either a b -> Maybe b
eitherToMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Either String NV
eitherNV
readNV :: String -> NV
readNV :: String -> NV
readNV = forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall a. HasCallStack => String -> a
error forall a. a -> a
id forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Either String NV
eitherNV