-- | Configuration for "Control.Monad.Logger".
module JmlSvc.Logging
  ( flags
  , Config
  , run
  ) where

import Protolude

import qualified Control.Monad.Logger as Logger
import qualified Options.Applicative as Options

-- | Configuration for logging.
newtype Config = Config Logger.LogLevel deriving (Eq, Show)

-- | Command-line flags controlling logging.
flags :: Options.Parser Config
flags =
  Config <$> Options.option
  (Options.eitherReader (pure . fromKeyword . toS))
  (fold
    [ Options.long "log-level"
    , Options.help "Minimum severity for log messages"
    , Options.value Logger.LevelInfo
    ])

-- | Run a logging action using the given config.
run :: MonadIO io => Config -> Logger.LoggingT io a -> io a
run (Config severity) action =
  Logger.runStdoutLoggingT (Logger.filterLogger predicate action)
  where
    predicate _source level = level >= severity

type Keyword = Text

fromKeyword :: Keyword -> Logger.LogLevel
fromKeyword "error" = Logger.LevelError
fromKeyword "warn" = Logger.LevelWarn
fromKeyword "info" = Logger.LevelInfo
fromKeyword "debug" = Logger.LevelDebug
fromKeyword other = Logger.LevelOther other

_toKeyword :: Logger.LogLevel -> Keyword
_toKeyword Logger.LevelError = "error"
_toKeyword Logger.LevelWarn = "warn"
_toKeyword Logger.LevelInfo = "info"
_toKeyword Logger.LevelDebug = "debug"
_toKeyword (Logger.LevelOther other) = other