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

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

import           Data.Aeson.Types ( FromJSON (..) )
import           Options.Applicative ( ReadM )
import qualified Options.Applicative.Types as OA
import           Stack.Prelude

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

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