{-# 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 (Eq, Generic, Show)

instance FromJSON ColorWhen where
  parseJSON v = do
    s <- parseJSON v
    case s of
      "never"  -> pure ColorNever
      "always" -> pure ColorAlways
      "auto"   -> pure ColorAuto
      _ -> fail ("Unknown color use: " <> s <> ". Expected values of " <>
                 "option are 'never', 'always', or 'auto'.")

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