Cabal-syntax-3.12.0.0: src/Distribution/CabalSpecVersion.hs
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
module Distribution.CabalSpecVersion where
import Distribution.Compat.Prelude
import Prelude ()
-- | Different Cabal-the-spec versions.
--
-- We branch based on this at least in the parser.
data CabalSpecVersion
= -- | this is older than 'CabalSpecV1_2'
CabalSpecV1_0
| -- | new syntax (sections)
CabalSpecV1_2
| CabalSpecV1_4
| CabalSpecV1_6
| CabalSpecV1_8
| CabalSpecV1_10
| CabalSpecV1_12
| -- 1.16 -- 1.14: no changes
CabalSpecV1_18
| CabalSpecV1_20
| CabalSpecV1_22
| CabalSpecV1_24
| CabalSpecV2_0
| CabalSpecV2_2
| CabalSpecV2_4
| CabalSpecV3_0
| -- 3.2: no changes
CabalSpecV3_4
| CabalSpecV3_6
| CabalSpecV3_8
| -- 3.10: no changes
CabalSpecV3_12
deriving (Eq, Ord, Show, Read, Enum, Bounded, Typeable, Data, Generic)
instance Binary CabalSpecVersion
instance Structured CabalSpecVersion
instance NFData CabalSpecVersion where rnf = genericRnf
-- | Show cabal spec version, but not the way in the .cabal files
--
-- @since 3.0.0.0
showCabalSpecVersion :: CabalSpecVersion -> String
showCabalSpecVersion CabalSpecV3_12 = "3.12"
showCabalSpecVersion CabalSpecV3_8 = "3.8"
showCabalSpecVersion CabalSpecV3_6 = "3.6"
showCabalSpecVersion CabalSpecV3_4 = "3.4"
showCabalSpecVersion CabalSpecV3_0 = "3.0"
showCabalSpecVersion CabalSpecV2_4 = "2.4"
showCabalSpecVersion CabalSpecV2_2 = "2.2"
showCabalSpecVersion CabalSpecV2_0 = "2.0"
showCabalSpecVersion CabalSpecV1_24 = "1.24"
showCabalSpecVersion CabalSpecV1_22 = "1.22"
showCabalSpecVersion CabalSpecV1_20 = "1.20"
showCabalSpecVersion CabalSpecV1_18 = "1.18"
showCabalSpecVersion CabalSpecV1_12 = "1.12"
showCabalSpecVersion CabalSpecV1_10 = "1.10"
showCabalSpecVersion CabalSpecV1_8 = "1.8"
showCabalSpecVersion CabalSpecV1_6 = "1.6"
showCabalSpecVersion CabalSpecV1_4 = "1.4"
showCabalSpecVersion CabalSpecV1_2 = "1.2"
showCabalSpecVersion CabalSpecV1_0 = "1.0"
cabalSpecLatest :: CabalSpecVersion
cabalSpecLatest = CabalSpecV3_12
-- | Parse 'CabalSpecVersion' from version digits.
--
-- It may fail if for recent versions the version is not exact.
cabalSpecFromVersionDigits :: [Int] -> Maybe CabalSpecVersion
cabalSpecFromVersionDigits v
| v == [3, 12] = Just CabalSpecV3_12
| v == [3, 8] = Just CabalSpecV3_8
| v == [3, 6] = Just CabalSpecV3_6
| v == [3, 4] = Just CabalSpecV3_4
| v == [3, 0] = Just CabalSpecV3_0
| v == [2, 4] = Just CabalSpecV2_4
| v == [2, 2] = Just CabalSpecV2_2
| v == [2, 0] = Just CabalSpecV2_0
| v >= [1, 25] = Nothing
| v >= [1, 23] = Just CabalSpecV1_24
| v >= [1, 21] = Just CabalSpecV1_22
| v >= [1, 19] = Just CabalSpecV1_20
| v >= [1, 17] = Just CabalSpecV1_18
| v >= [1, 11] = Just CabalSpecV1_12
| v >= [1, 9] = Just CabalSpecV1_10
| v >= [1, 7] = Just CabalSpecV1_8
| v >= [1, 5] = Just CabalSpecV1_6
| v >= [1, 3] = Just CabalSpecV1_4
| v >= [1, 1] = Just CabalSpecV1_2
| otherwise = Just CabalSpecV1_0
-- | @since 3.4.0.0
cabalSpecToVersionDigits :: CabalSpecVersion -> [Int]
cabalSpecToVersionDigits CabalSpecV3_12 = [3, 12]
cabalSpecToVersionDigits CabalSpecV3_8 = [3, 8]
cabalSpecToVersionDigits CabalSpecV3_6 = [3, 6]
cabalSpecToVersionDigits CabalSpecV3_4 = [3, 4]
cabalSpecToVersionDigits CabalSpecV3_0 = [3, 0]
cabalSpecToVersionDigits CabalSpecV2_4 = [2, 4]
cabalSpecToVersionDigits CabalSpecV2_2 = [2, 2]
cabalSpecToVersionDigits CabalSpecV2_0 = [2, 0]
cabalSpecToVersionDigits CabalSpecV1_24 = [1, 24]
cabalSpecToVersionDigits CabalSpecV1_22 = [1, 22]
cabalSpecToVersionDigits CabalSpecV1_20 = [1, 20]
cabalSpecToVersionDigits CabalSpecV1_18 = [1, 18]
cabalSpecToVersionDigits CabalSpecV1_12 = [1, 12]
cabalSpecToVersionDigits CabalSpecV1_10 = [1, 10]
cabalSpecToVersionDigits CabalSpecV1_8 = [1, 8]
cabalSpecToVersionDigits CabalSpecV1_6 = [1, 6]
cabalSpecToVersionDigits CabalSpecV1_4 = [1, 4]
cabalSpecToVersionDigits CabalSpecV1_2 = [1, 2]
cabalSpecToVersionDigits CabalSpecV1_0 = [1, 0]
-- | What is the minimum Cabal library version which knows how handle
-- this spec version.
--
-- /Note:/ this is a point where we could decouple cabal-spec and Cabal
-- versions, if we ever want that.
--
-- >>> cabalSpecMinimumLibraryVersion CabalSpecV3_0
-- [2,5]
--
-- >>> cabalSpecMinimumLibraryVersion CabalSpecV2_4
-- [2,3]
--
-- @since 3.4.0.0
cabalSpecMinimumLibraryVersion :: CabalSpecVersion -> [Int]
cabalSpecMinimumLibraryVersion CabalSpecV1_0 = [1, 0]
cabalSpecMinimumLibraryVersion csv = case cabalSpecToVersionDigits (pred csv) of
[x, y] -> [x, y + 1]
xs -> xs
specHasCommonStanzas :: CabalSpecVersion -> HasCommonStanzas
specHasCommonStanzas v =
if v >= CabalSpecV2_2
then HasCommonStanzas
else NoCommonStanzas
specHasElif :: CabalSpecVersion -> HasElif
specHasElif v =
if v >= CabalSpecV2_2
then HasElif
else NoElif
-------------------------------------------------------------------------------
-- Booleans
-------------------------------------------------------------------------------
-- IDEA: make some kind of tagged booleans?
data HasElif = HasElif | NoElif
deriving (Eq, Show)
data HasCommonStanzas = HasCommonStanzas | NoCommonStanzas
deriving (Eq, Show)
data HasGlobstar = HasGlobstar | NoGlobstar