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

module Stack.Options.LogLevelParser
  ( logLevelOptsParser
  ) where

import qualified Data.Text as T
import           Options.Applicative
                   ( Parser, completeWith, flag', help, long, metavar, short
                   , strOption
                   )
import           Stack.Options.Utils ( hideMods )
import           Stack.Prelude

-- | Parser for a logging level.

logLevelOptsParser :: Bool -> Maybe LogLevel -> Parser (Maybe LogLevel)
logLevelOptsParser :: Bool -> Maybe LogLevel -> Parser (Maybe LogLevel)
logLevelOptsParser Bool
hide Maybe LogLevel
defLogLevel = ([Char] -> Maybe LogLevel)
-> Parser [Char] -> Parser (Maybe LogLevel)
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (LogLevel -> Maybe LogLevel
forall a. a -> Maybe a
Just (LogLevel -> Maybe LogLevel)
-> ([Char] -> LogLevel) -> [Char] -> Maybe LogLevel
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> LogLevel
parse)
      (Mod OptionFields [Char] -> Parser [Char]
forall s. IsString s => Mod OptionFields s -> Parser s
strOption
        (  [Char] -> Mod OptionFields [Char]
forall (f :: * -> *) a. HasName f => [Char] -> Mod f a
long [Char]
"verbosity"
        Mod OptionFields [Char]
-> Mod OptionFields [Char] -> Mod OptionFields [Char]
forall a. Semigroup a => a -> a -> a
<> [Char] -> Mod OptionFields [Char]
forall (f :: * -> *) a. HasMetavar f => [Char] -> Mod f a
metavar [Char]
"VERBOSITY"
        Mod OptionFields [Char]
-> Mod OptionFields [Char] -> Mod OptionFields [Char]
forall a. Semigroup a => a -> a -> a
<> [[Char]] -> Mod OptionFields [Char]
forall (f :: * -> *) a. HasCompleter f => [[Char]] -> Mod f a
completeWith [[Char]
"silent", [Char]
"error", [Char]
"warn", [Char]
"info", [Char]
"debug"]
        Mod OptionFields [Char]
-> Mod OptionFields [Char] -> Mod OptionFields [Char]
forall a. Semigroup a => a -> a -> a
<> [Char] -> Mod OptionFields [Char]
forall (f :: * -> *) a. [Char] -> Mod f a
help [Char]
"Verbosity: silent, error, warn, info, debug"
        Mod OptionFields [Char]
-> Mod OptionFields [Char] -> Mod OptionFields [Char]
forall a. Semigroup a => a -> a -> a
<> Bool -> Mod OptionFields [Char]
forall (f :: * -> *) a. Bool -> Mod f a
hideMods Bool
hide
        ))
  Parser (Maybe LogLevel)
-> Parser (Maybe LogLevel) -> Parser (Maybe LogLevel)
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe LogLevel
-> Mod FlagFields (Maybe LogLevel) -> Parser (Maybe LogLevel)
forall a. a -> Mod FlagFields a -> Parser a
flag' (LogLevel -> Maybe LogLevel
forall a. a -> Maybe a
Just LogLevel
verboseLevel)
        (  Char -> Mod FlagFields (Maybe LogLevel)
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'v'
        Mod FlagFields (Maybe LogLevel)
-> Mod FlagFields (Maybe LogLevel)
-> Mod FlagFields (Maybe LogLevel)
forall a. Semigroup a => a -> a -> a
<> [Char] -> Mod FlagFields (Maybe LogLevel)
forall (f :: * -> *) a. HasName f => [Char] -> Mod f a
long [Char]
"verbose"
        Mod FlagFields (Maybe LogLevel)
-> Mod FlagFields (Maybe LogLevel)
-> Mod FlagFields (Maybe LogLevel)
forall a. Semigroup a => a -> a -> a
<> [Char] -> Mod FlagFields (Maybe LogLevel)
forall (f :: * -> *) a. [Char] -> Mod f a
help
             (  [Char]
"Enable verbose mode: verbosity level \""
             [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> LogLevel -> [Char]
showLevel LogLevel
verboseLevel
             [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
"\""
             )
        Mod FlagFields (Maybe LogLevel)
-> Mod FlagFields (Maybe LogLevel)
-> Mod FlagFields (Maybe LogLevel)
forall a. Semigroup a => a -> a -> a
<> Bool -> Mod FlagFields (Maybe LogLevel)
forall (f :: * -> *) a. Bool -> Mod f a
hideMods Bool
hide
        )
  Parser (Maybe LogLevel)
-> Parser (Maybe LogLevel) -> Parser (Maybe LogLevel)
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe LogLevel
-> Mod FlagFields (Maybe LogLevel) -> Parser (Maybe LogLevel)
forall a. a -> Mod FlagFields a -> Parser a
flag' (LogLevel -> Maybe LogLevel
forall a. a -> Maybe a
Just LogLevel
silentLevel)
        (  [Char] -> Mod FlagFields (Maybe LogLevel)
forall (f :: * -> *) a. HasName f => [Char] -> Mod f a
long [Char]
"silent"
        Mod FlagFields (Maybe LogLevel)
-> Mod FlagFields (Maybe LogLevel)
-> Mod FlagFields (Maybe LogLevel)
forall a. Semigroup a => a -> a -> a
<> [Char] -> Mod FlagFields (Maybe LogLevel)
forall (f :: * -> *) a. [Char] -> Mod f a
help (  [Char]
"Enable silent mode: verbosity level \""
                [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> LogLevel -> [Char]
showLevel LogLevel
silentLevel
                [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
"\""
                )
        Mod FlagFields (Maybe LogLevel)
-> Mod FlagFields (Maybe LogLevel)
-> Mod FlagFields (Maybe LogLevel)
forall a. Semigroup a => a -> a -> a
<> Bool -> Mod FlagFields (Maybe LogLevel)
forall (f :: * -> *) a. Bool -> Mod f a
hideMods Bool
hide
        )
  Parser (Maybe LogLevel)
-> Parser (Maybe LogLevel) -> Parser (Maybe LogLevel)
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe LogLevel -> Parser (Maybe LogLevel)
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe LogLevel
defLogLevel
 where
  verboseLevel :: LogLevel
verboseLevel = LogLevel
LevelDebug
  silentLevel :: LogLevel
silentLevel = Text -> LogLevel
LevelOther Text
"silent"
  showLevel :: LogLevel -> [Char]
showLevel LogLevel
l = case LogLevel
l of
    LogLevel
LevelDebug -> [Char]
"debug"
    LogLevel
LevelInfo -> [Char]
"info"
    LogLevel
LevelWarn -> [Char]
"warn"
    LogLevel
LevelError -> [Char]
"error"
    LevelOther Text
x -> Text -> [Char]
T.unpack Text
x
  parse :: [Char] -> LogLevel
parse [Char]
s = case [Char]
s of
    [Char]
"debug" -> LogLevel
LevelDebug
    [Char]
"info" -> LogLevel
LevelInfo
    [Char]
"warn" -> LogLevel
LevelWarn
    [Char]
"error" -> LogLevel
LevelError
    [Char]
_ -> Text -> LogLevel
LevelOther ([Char] -> Text
T.pack [Char]
s)