module Blammo.Logging
  ( LogSettings
  , LogLevel(..)
  , LogDestination(..)
  , LogFormat(..)
  , LogColor(..)
  , defaultLogSettings
  , setLogSettingsLevels
  , setLogSettingsDestination
  , setLogSettingsFormat
  , setLogSettingsColor
  , Logger
  , HasLogger(..)
  , newLogger
  , runLoggerLoggingT

  -- * Re-exports from "Control.Monad.Logger.Aeson"
  -- ** Messages
  , Message(..)
  , (.=)
  , Series

  -- ** Thread Context
  , MonadMask
  , withThreadContext
  , myThreadContext
  , Pair

  -- ** Transformer
  , MonadLogger(..)
  , MonadLoggerIO(..)
  , LoggingT

  -- ** Common logging functions
  -- | Import "Control.Monad.Logger.Aeson" if you want more

  -- *** Implicit call stack, no 'LogSource'
  , logDebug
  , logInfo
  , logWarn
  , logError
  , logOther

  -- *** Implicit call stack, with 'LogSource'
  , LogSource
  , logDebugNS
  , logInfoNS
  , logWarnNS
  , logErrorNS
  , logOtherNS
  ) where

import Prelude

import Blammo.Logging.LogSettings
import Blammo.Logging.Logger
import Control.Lens ((^.))
import Control.Monad.Catch (MonadMask)
import Control.Monad.IO.Class (MonadIO(..))
import Control.Monad.Logger.Aeson
import Data.Aeson (Series)
import Data.Aeson.Types (Pair)
import Data.ByteString (ByteString)

runLoggerLoggingT :: (MonadIO m, HasLogger env) => env -> LoggingT m a -> m a
runLoggerLoggingT :: env -> LoggingT m a -> m a
runLoggerLoggingT env
env LoggingT m a
f = do
  a
a <- LoggingT m a
-> (Loc -> LogSource -> LogLevel -> LogStr -> IO ()) -> m a
forall (m :: * -> *) a.
LoggingT m a
-> (Loc -> LogSource -> LogLevel -> LogStr -> IO ()) -> m a
runLoggingT
    ((LogSource -> LogLevel -> Bool) -> LoggingT m a -> LoggingT m a
forall (m :: * -> *) a.
(LogSource -> LogLevel -> Bool) -> LoggingT m a -> LoggingT m a
filterLogger (Logger -> LogSource -> LogLevel -> Bool
getLoggerShouldLog Logger
logger) LoggingT m a
f)
    (Logger
-> (LogLevel -> ByteString -> ByteString)
-> Loc
-> LogSource
-> LogLevel
-> LogStr
-> IO ()
loggerOutput Logger
logger ((LogLevel -> ByteString -> ByteString)
 -> Loc -> LogSource -> LogLevel -> LogStr -> IO ())
-> (LogLevel -> ByteString -> ByteString)
-> Loc
-> LogSource
-> LogLevel
-> LogStr
-> IO ()
forall a b. (a -> b) -> a -> b
$ Logger -> LogLevel -> ByteString -> ByteString
getLoggerReformat Logger
logger)
  a
a a -> m () -> m a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Logger -> m ()
forall (m :: * -> *). MonadIO m => Logger -> m ()
flushLogStr Logger
logger
  where logger :: Logger
logger = env
env env -> Getting Logger env Logger -> Logger
forall s a. s -> Getting a s a -> a
^. Getting Logger env Logger
forall env. HasLogger env => Lens' env Logger
loggerL

loggerOutput
  :: Logger
  -> (LogLevel -> ByteString -> ByteString)
  -> Loc
  -> LogSource
  -> LogLevel
  -> LogStr
  -> IO ()
loggerOutput :: Logger
-> (LogLevel -> ByteString -> ByteString)
-> Loc
-> LogSource
-> LogLevel
-> LogStr
-> IO ()
loggerOutput Logger
logger LogLevel -> ByteString -> ByteString
reformat =
  OutputOptions -> Loc -> LogSource -> LogLevel -> LogStr -> IO ()
defaultOutputWith (OutputOptions -> Loc -> LogSource -> LogLevel -> LogStr -> IO ())
-> OutputOptions -> Loc -> LogSource -> LogLevel -> LogStr -> IO ()
forall a b. (a -> b) -> a -> b
$ (LogLevel -> ByteString -> IO ()) -> OutputOptions
defaultOutputOptions ((LogLevel -> ByteString -> IO ()) -> OutputOptions)
-> (LogLevel -> ByteString -> IO ()) -> OutputOptions
forall a b. (a -> b) -> a -> b
$ \LogLevel
logLevel ByteString
bytes -> do
    Logger -> LogStr -> IO ()
forall (m :: * -> *). MonadIO m => Logger -> LogStr -> m ()
pushLogStrLn Logger
logger (LogStr -> IO ()) -> LogStr -> IO ()
forall a b. (a -> b) -> a -> b
$ ByteString -> LogStr
forall msg. ToLogStr msg => msg -> LogStr
toLogStr (ByteString -> LogStr) -> ByteString -> LogStr
forall a b. (a -> b) -> a -> b
$ LogLevel -> ByteString -> ByteString
reformat LogLevel
logLevel ByteString
bytes