stack-all-0.3.1: src/MajorVer.hs
module MajorVer (
MajorVer(..),
eitherReadMajor,
maybeReadMajor,
readCompactMajor,
readMajor,
showMajor
)
where
import Control.Applicative
import Data.List.Extra
import SimpleCmd (error')
import Text.Read (readMaybe)
-- FIXME allow specific snapshots?
-- FIXME support "lts"?
data MajorVer = LTS Int | Nightly
deriving (Eq, Ord)
maybeReadMajor :: String -> Maybe MajorVer
maybeReadMajor "nightly" = Just Nightly
maybeReadMajor ver =
if "lts" `isPrefixOf` ver then
case readMaybe (dropPrefix "lts-" ver) <|> readMaybe (dropPrefix "lts" ver) of
Just major -> Just (LTS major)
Nothing -> Nothing
else Nothing
-- readMajor "lts-16"
readMajor :: String -> MajorVer
readMajor "nightly" = Nightly
readMajor ver =
case maybeReadMajor ver of
Just s -> s
Nothing ->
error' $! "couldn't parse " ++ ver ++ " (expected lts-XX or ltsXX)"
-- readCompactMajor "lts16"
readCompactMajor :: String -> Maybe MajorVer
readCompactMajor "nightly" = Just Nightly
readCompactMajor ver =
if "lts" `isPrefixOf` ver then
case readMaybe (dropPrefix "lts" ver) of
Just major -> Just (LTS major)
Nothing -> error' $! "couldn't parse compact " ++ ver ++ " (expected ltsXX)"
else Nothing
eitherReadMajor :: String -> Either String MajorVer
eitherReadMajor cs =
case maybeReadMajor cs of
Just s -> Right s
_ -> Left cs
showMajor :: MajorVer -> String
showMajor Nightly = "nightly"
showMajor (LTS ver) = "lts-" ++ show ver