module JmlSvc.Logging
( flags
, Config
, run
) where
import Protolude
import qualified Control.Monad.Logger as Logger
import qualified Options.Applicative as Options
newtype Config = Config Logger.LogLevel deriving (Eq, Show)
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 :: 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