stack-2.13.1: src/Stack/Types/GHCVariant.hs
{-# LANGUAGE NoImplicitPrelude #-}
module Stack.Types.GHCVariant
( GHCVariant (..)
, HasGHCVariant (..)
, ghcVariantName
, ghcVariantSuffix
, parseGHCVariant
) where
import Data.Aeson.Types ( FromJSON, parseJSON, withText )
import Data.List ( stripPrefix )
import qualified Data.Text as T
import Stack.Prelude
-- | Specialized variant of GHC (e.g. libgmp4 or integer-simple)
data GHCVariant
= GHCStandard
-- ^ Standard bindist
| GHCIntegerSimple
-- ^ Bindist that uses integer-simple
| GHCNativeBignum
-- ^ Bindist that uses the Haskell-native big-integer backend
| GHCCustom String
-- ^ Other bindists
deriving Show
instance FromJSON GHCVariant where
-- Strange structuring is to give consistent error messages
parseJSON =
withText
"GHCVariant"
(either (fail . show) pure . parseGHCVariant . T.unpack)
-- | Class for environment values which have a GHCVariant
class HasGHCVariant env where
ghcVariantL :: SimpleGetter env GHCVariant
instance HasGHCVariant GHCVariant where
ghcVariantL = id
{-# INLINE ghcVariantL #-}
-- | Render a GHC variant to a String.
ghcVariantName :: GHCVariant -> String
ghcVariantName GHCStandard = "standard"
ghcVariantName GHCIntegerSimple = "integersimple"
ghcVariantName GHCNativeBignum = "int-native"
ghcVariantName (GHCCustom name) = "custom-" ++ name
-- | Render a GHC variant to a String suffix.
ghcVariantSuffix :: GHCVariant -> String
ghcVariantSuffix GHCStandard = ""
ghcVariantSuffix v = "-" ++ ghcVariantName v
-- | Parse GHC variant from a String.
parseGHCVariant :: (MonadThrow m) => String -> m GHCVariant
parseGHCVariant s =
case stripPrefix "custom-" s of
Just name -> pure (GHCCustom name)
Nothing
| s == "" -> pure GHCStandard
| s == "standard" -> pure GHCStandard
| s == "integersimple" -> pure GHCIntegerSimple
| s == "int-native" -> pure GHCNativeBignum
| otherwise -> pure (GHCCustom s)