{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}

module Stack.Types.CabalConfigKey
  ( CabalConfigKey (..)
  , parseCabalConfigKey
  ) where

import qualified Data.Text as T
import           Pantry.Internal.AesonExtended
                   ( FromJSON (..), FromJSONKey (..), FromJSONKeyFunction (..)
                   , withText
                   )
import           Stack.Prelude

-- | Which packages do configure opts apply to?

data CabalConfigKey
  = CCKTargets -- ^ See AGOTargets

  | CCKLocals -- ^ See AGOLocals

  | CCKEverything -- ^ See AGOEverything

  | CCKPackage !PackageName -- ^ A specific package

  deriving (Int -> CabalConfigKey -> ShowS
[CabalConfigKey] -> ShowS
CabalConfigKey -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CabalConfigKey] -> ShowS
$cshowList :: [CabalConfigKey] -> ShowS
show :: CabalConfigKey -> String
$cshow :: CabalConfigKey -> String
showsPrec :: Int -> CabalConfigKey -> ShowS
$cshowsPrec :: Int -> CabalConfigKey -> ShowS
Show, ReadPrec [CabalConfigKey]
ReadPrec CabalConfigKey
Int -> ReadS CabalConfigKey
ReadS [CabalConfigKey]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CabalConfigKey]
$creadListPrec :: ReadPrec [CabalConfigKey]
readPrec :: ReadPrec CabalConfigKey
$creadPrec :: ReadPrec CabalConfigKey
readList :: ReadS [CabalConfigKey]
$creadList :: ReadS [CabalConfigKey]
readsPrec :: Int -> ReadS CabalConfigKey
$creadsPrec :: Int -> ReadS CabalConfigKey
Read, CabalConfigKey -> CabalConfigKey -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CabalConfigKey -> CabalConfigKey -> Bool
$c/= :: CabalConfigKey -> CabalConfigKey -> Bool
== :: CabalConfigKey -> CabalConfigKey -> Bool
$c== :: CabalConfigKey -> CabalConfigKey -> Bool
Eq, Eq CabalConfigKey
CabalConfigKey -> CabalConfigKey -> Bool
CabalConfigKey -> CabalConfigKey -> Ordering
CabalConfigKey -> CabalConfigKey -> CabalConfigKey
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
min :: CabalConfigKey -> CabalConfigKey -> CabalConfigKey
$cmin :: CabalConfigKey -> CabalConfigKey -> CabalConfigKey
max :: CabalConfigKey -> CabalConfigKey -> CabalConfigKey
$cmax :: CabalConfigKey -> CabalConfigKey -> CabalConfigKey
>= :: CabalConfigKey -> CabalConfigKey -> Bool
$c>= :: CabalConfigKey -> CabalConfigKey -> Bool
> :: CabalConfigKey -> CabalConfigKey -> Bool
$c> :: CabalConfigKey -> CabalConfigKey -> Bool
<= :: CabalConfigKey -> CabalConfigKey -> Bool
$c<= :: CabalConfigKey -> CabalConfigKey -> Bool
< :: CabalConfigKey -> CabalConfigKey -> Bool
$c< :: CabalConfigKey -> CabalConfigKey -> Bool
compare :: CabalConfigKey -> CabalConfigKey -> Ordering
$ccompare :: CabalConfigKey -> CabalConfigKey -> Ordering
Ord)

instance FromJSON CabalConfigKey where
  parseJSON :: Value -> Parser CabalConfigKey
parseJSON = forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
"CabalConfigKey" forall (m :: * -> *).
(Monad m, MonadFail m) =>
Text -> m CabalConfigKey
parseCabalConfigKey

instance FromJSONKey CabalConfigKey where
  fromJSONKey :: FromJSONKeyFunction CabalConfigKey
fromJSONKey = forall a. (Text -> Parser a) -> FromJSONKeyFunction a
FromJSONKeyTextParser forall (m :: * -> *).
(Monad m, MonadFail m) =>
Text -> m CabalConfigKey
parseCabalConfigKey

parseCabalConfigKey :: (Monad m, MonadFail m) => Text -> m CabalConfigKey
parseCabalConfigKey :: forall (m :: * -> *).
(Monad m, MonadFail m) =>
Text -> m CabalConfigKey
parseCabalConfigKey Text
"$targets" = forall (f :: * -> *) a. Applicative f => a -> f a
pure CabalConfigKey
CCKTargets
parseCabalConfigKey Text
"$locals" = forall (f :: * -> *) a. Applicative f => a -> f a
pure CabalConfigKey
CCKLocals
parseCabalConfigKey Text
"$everything" = forall (f :: * -> *) a. Applicative f => a -> f a
pure CabalConfigKey
CCKEverything
parseCabalConfigKey Text
name =
  case String -> Maybe PackageName
parsePackageName forall a b. (a -> b) -> a -> b
$ Text -> String
T.unpack Text
name of
    Maybe PackageName
Nothing -> forall (m :: * -> *) a. MonadFail m => String -> m a
fail forall a b. (a -> b) -> a -> b
$ String
"Invalid CabalConfigKey: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Text
name
    Just PackageName
x -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ PackageName -> CabalConfigKey
CCKPackage PackageName
x