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

module Stack.Types.ColorWhen
  ( ColorWhen (..)
  , readColorWhen
  ) where

import           Options.Applicative ( ReadM )
import qualified Options.Applicative.Types as OA
import           Pantry.Internal.AesonExtended ( FromJSON (..) )
import           Stack.Prelude

data ColorWhen
  = ColorNever
  | ColorAlways
  | ColorAuto
  deriving (ColorWhen -> ColorWhen -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ColorWhen -> ColorWhen -> Bool
$c/= :: ColorWhen -> ColorWhen -> Bool
== :: ColorWhen -> ColorWhen -> Bool
$c== :: ColorWhen -> ColorWhen -> Bool
Eq, forall x. Rep ColorWhen x -> ColorWhen
forall x. ColorWhen -> Rep ColorWhen x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ColorWhen x -> ColorWhen
$cfrom :: forall x. ColorWhen -> Rep ColorWhen x
Generic, Int -> ColorWhen -> ShowS
[ColorWhen] -> ShowS
ColorWhen -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ColorWhen] -> ShowS
$cshowList :: [ColorWhen] -> ShowS
show :: ColorWhen -> String
$cshow :: ColorWhen -> String
showsPrec :: Int -> ColorWhen -> ShowS
$cshowsPrec :: Int -> ColorWhen -> ShowS
Show)

instance FromJSON ColorWhen where
  parseJSON :: Value -> Parser ColorWhen
parseJSON Value
v = do
    String
s <- forall a. FromJSON a => Value -> Parser a
parseJSON Value
v
    case String
s of
      String
"never"  -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ColorWhen
ColorNever
      String
"always" -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ColorWhen
ColorAlways
      String
"auto"   -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ColorWhen
ColorAuto
      String
_ -> forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
"Unknown color use: " forall a. Semigroup a => a -> a -> a
<> String
s forall a. Semigroup a => a -> a -> a
<> String
". Expected values of " forall a. Semigroup a => a -> a -> a
<>
                 String
"option are 'never', 'always', or 'auto'.")

readColorWhen :: ReadM ColorWhen
readColorWhen :: ReadM ColorWhen
readColorWhen = do
  String
s <- ReadM String
OA.readerAsk
  case String
s of
    String
"never" -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ColorWhen
ColorNever
    String
"always" -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ColorWhen
ColorAlways
    String
"auto" -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ColorWhen
ColorAuto
    String
_ -> forall a. String -> ReadM a
OA.readerError String
"Expected values of color option are 'never', \
                        \'always', or 'auto'."