{-# LANGUAGE CPP #-}

-- | Safe and unsafe logging functions wrapping Control.Logging
module L3.Log.Logging
  ( module L3.Log.Logging,
    LogLevel (LevelDebug, LevelInfo, LevelWarn, LevelError),
    withStderrLogging,
    withStdoutLogging,
    withFileLogging,
    setLogLevel,
    setDebugSourceRegex,
  )
where

import Control.Logging
  ( LogLevel (LevelDebug, LevelError, LevelInfo, LevelWarn),
    setDebugSourceRegex,
    setLogLevel,
    withFileLogging,
    withStderrLogging,
    withStdoutLogging,
  )
import qualified Control.Logging
import Control.Monad.IO.Class (MonadIO)
import Control.Monad.Trans.Control (MonadBaseControl)
import Data.Text (pack)
import GHC.IO (unsafeDupablePerformIO)
import L3.Log.Colors

logId :: (String -> String -> IO ()) -> String -> String -> a -> IO a
logId :: (String -> String -> IO ()) -> String -> String -> a -> IO a
logId String -> String -> IO ()
logger String
src String
msg a
a = do
  ()
_ <- String -> String -> IO ()
logger String
src String
msg
  a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
a

traceU :: String -> String -> a -> a
#ifdef LOGTRACE
traceU src msg = Control.Logging.traceSL (pack $ brightWhite ++ src ++ reset) (pack msg)
#define LOGDEBUG
#else
traceU :: String -> String -> a -> a
traceU String
_ String
_ = a -> a
forall a. a -> a
id
#endif

debugM :: String -> String -> IO ()
debugU :: String -> String -> a -> a
#ifdef LOGDEBUG
debugM :: String -> String -> IO ()
debugM String
src String
msg = Text -> Text -> IO ()
Control.Logging.debugS (String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ String
blue String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
src String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
reset) (String -> Text
pack String
msg)
debugU :: String -> String -> a -> a
debugU String
src String
msg = IO a -> a
forall a. IO a -> a
unsafeDupablePerformIO (IO a -> a) -> (a -> IO a) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> String -> IO ()) -> String -> String -> a -> IO a
forall a.
(String -> String -> IO ()) -> String -> String -> a -> IO a
logId String -> String -> IO ()
debugM String
src String
msg
#define LOGINFO
#else
debugM _ _ = return ()
debugU _ _ = id
#endif

infoM :: String -> String -> IO ()
infoU :: String -> String -> a -> a
#ifdef LOGINFO
infoM :: String -> String -> IO ()
infoM String
src String
msg = Text -> Text -> IO ()
Control.Logging.logS (String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ String
green String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
src String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
reset) (String -> Text
pack String
msg)
infoU :: String -> String -> a -> a
infoU String
src String
msg = IO a -> a
forall a. IO a -> a
unsafeDupablePerformIO (IO a -> a) -> (a -> IO a) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> String -> IO ()) -> String -> String -> a -> IO a
forall a.
(String -> String -> IO ()) -> String -> String -> a -> IO a
logId String -> String -> IO ()
infoM String
src String
msg
#define LOGWARN
#else
infoM _ _ = return ()
infoU _ _ = id
#endif

warnM :: String -> String -> IO ()
warnU :: String -> String -> a -> a
#ifdef LOGWARN
warnM :: String -> String -> IO ()
warnM String
src String
msg  = Text -> Text -> IO ()
Control.Logging.warnS (String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ String
yellow String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
src String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
reset) (String -> Text
pack String
msg)
warnU :: String -> String -> a -> a
warnU String
src String
msg  = IO a -> a
forall a. IO a -> a
unsafeDupablePerformIO (IO a -> a) -> (a -> IO a) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> String -> IO ()) -> String -> String -> a -> IO a
forall a.
(String -> String -> IO ()) -> String -> String -> a -> IO a
logId String -> String -> IO ()
warnM String
src String
msg
#else
warnM _ _  = return ()
warnU _ _  = id
#endif

errorU :: String -> String -> a
errorU :: String -> String -> a
errorU String
src String
msg = Text -> Text -> a
forall a. Text -> Text -> a
Control.Logging.errorSL (String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ String
red String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
src String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
reset) (String -> Text
pack String
msg)