{-# LANGUAGE NoImplicitPrelude #-}

-- | Type representing MSYS2 environments and related functions.

module Stack.Types.MsysEnvironment
  ( MsysEnvironment (..)
  , msysEnvArch
  , relDirMsysEnv
  ) where

import           Data.Aeson.Types ( FromJSON (..) )
import           Distribution.System ( Arch (..) )
import           Stack.Constants
                   ( relDirClang32, relDirClang64, relDirClangArm64
                   , relDirMingw32, relDirMingw64, relDirUcrt64
                   )
import           Stack.Prelude

-- | Type representing MSYS2 environments.

data MsysEnvironment
  = CLANG32
  | CLANG64
  | CLANGARM64
  | MINGW32
    -- ^ Stack's default on architecture i386, and applied if GHC version is

    -- earlier than GHC 9.6.

  | MINGW64
    -- ^ Stack's default on architecture x86_64, and applied if GHC version is

    -- earlier than GHC 9.6.

  | UCRT64
  deriving (MsysEnvironment -> MsysEnvironment -> Bool
(MsysEnvironment -> MsysEnvironment -> Bool)
-> (MsysEnvironment -> MsysEnvironment -> Bool)
-> Eq MsysEnvironment
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MsysEnvironment -> MsysEnvironment -> Bool
== :: MsysEnvironment -> MsysEnvironment -> Bool
$c/= :: MsysEnvironment -> MsysEnvironment -> Bool
/= :: MsysEnvironment -> MsysEnvironment -> Bool
Eq, Eq MsysEnvironment
Eq MsysEnvironment =>
(MsysEnvironment -> MsysEnvironment -> Ordering)
-> (MsysEnvironment -> MsysEnvironment -> Bool)
-> (MsysEnvironment -> MsysEnvironment -> Bool)
-> (MsysEnvironment -> MsysEnvironment -> Bool)
-> (MsysEnvironment -> MsysEnvironment -> Bool)
-> (MsysEnvironment -> MsysEnvironment -> MsysEnvironment)
-> (MsysEnvironment -> MsysEnvironment -> MsysEnvironment)
-> Ord MsysEnvironment
MsysEnvironment -> MsysEnvironment -> Bool
MsysEnvironment -> MsysEnvironment -> Ordering
MsysEnvironment -> MsysEnvironment -> MsysEnvironment
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: MsysEnvironment -> MsysEnvironment -> Ordering
compare :: MsysEnvironment -> MsysEnvironment -> Ordering
$c< :: MsysEnvironment -> MsysEnvironment -> Bool
< :: MsysEnvironment -> MsysEnvironment -> Bool
$c<= :: MsysEnvironment -> MsysEnvironment -> Bool
<= :: MsysEnvironment -> MsysEnvironment -> Bool
$c> :: MsysEnvironment -> MsysEnvironment -> Bool
> :: MsysEnvironment -> MsysEnvironment -> Bool
$c>= :: MsysEnvironment -> MsysEnvironment -> Bool
>= :: MsysEnvironment -> MsysEnvironment -> Bool
$cmax :: MsysEnvironment -> MsysEnvironment -> MsysEnvironment
max :: MsysEnvironment -> MsysEnvironment -> MsysEnvironment
$cmin :: MsysEnvironment -> MsysEnvironment -> MsysEnvironment
min :: MsysEnvironment -> MsysEnvironment -> MsysEnvironment
Ord, Int -> MsysEnvironment -> ShowS
[MsysEnvironment] -> ShowS
MsysEnvironment -> String
(Int -> MsysEnvironment -> ShowS)
-> (MsysEnvironment -> String)
-> ([MsysEnvironment] -> ShowS)
-> Show MsysEnvironment
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MsysEnvironment -> ShowS
showsPrec :: Int -> MsysEnvironment -> ShowS
$cshow :: MsysEnvironment -> String
show :: MsysEnvironment -> String
$cshowList :: [MsysEnvironment] -> ShowS
showList :: [MsysEnvironment] -> ShowS
Show)

-- | MSYS2 environment names are treated as case sensitive.

instance FromJSON MsysEnvironment where
  parseJSON :: Value -> Parser MsysEnvironment
parseJSON Value
v = do
    String
s <- Value -> Parser String
forall a. FromJSON a => Value -> Parser a
parseJSON Value
v
    case String
s of
      String
"CLANG32" -> MsysEnvironment -> Parser MsysEnvironment
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure MsysEnvironment
CLANG32
      String
"CLANG64" -> MsysEnvironment -> Parser MsysEnvironment
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure MsysEnvironment
CLANG64
      String
"CLANGARM64" -> MsysEnvironment -> Parser MsysEnvironment
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure MsysEnvironment
CLANGARM64
      String
"MINGW32" -> MsysEnvironment -> Parser MsysEnvironment
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure MsysEnvironment
MINGW32
      String
"MINGW64" -> MsysEnvironment -> Parser MsysEnvironment
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure MsysEnvironment
MINGW64
      String
"UCRT64" -> MsysEnvironment -> Parser MsysEnvironment
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure MsysEnvironment
UCRT64
      String
_ -> String -> Parser MsysEnvironment
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
"Unknown MSYS2 environment: " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
s)

-- | Function that yields the architecture relevant to an MSYS2 environment,

-- based on https://www.msys2.org/docs/environments/.

msysEnvArch :: MsysEnvironment -> Arch
msysEnvArch :: MsysEnvironment -> Arch
msysEnvArch MsysEnvironment
env = case MsysEnvironment
env of
  MsysEnvironment
CLANG32 -> Arch
I386
  MsysEnvironment
CLANG64 -> Arch
X86_64
  MsysEnvironment
CLANGARM64 -> Arch
AArch64
  MsysEnvironment
MINGW32 -> Arch
I386
  MsysEnvironment
MINGW64 -> Arch
X86_64
  MsysEnvironment
UCRT64 -> Arch
X86_64

-- | Function that yields the prefix relevant to an MSYS2 environment, based on

-- https://www.msys2.org/docs/environments/.

relDirMsysEnv :: MsysEnvironment -> Path Rel Dir
relDirMsysEnv :: MsysEnvironment -> Path Rel Dir
relDirMsysEnv MsysEnvironment
env = case MsysEnvironment
env of
  MsysEnvironment
CLANG32 -> Path Rel Dir
relDirClang32
  MsysEnvironment
CLANG64 -> Path Rel Dir
relDirClang64
  MsysEnvironment
CLANGARM64 -> Path Rel Dir
relDirClangArm64
  MsysEnvironment
MINGW32 -> Path Rel Dir
relDirMingw32
  MsysEnvironment
MINGW64 -> Path Rel Dir
relDirMingw64
  MsysEnvironment
UCRT64 -> Path Rel Dir
relDirUcrt64