{-# LANGUAGE OverloadedStrings #-}

module HaskellWorks.CabalCache.AWS.Env
  ( awsLogger
  ) where

import Antiope.Env                  (LogLevel (..))
import Control.Concurrent           (myThreadId)
import Control.Monad
import HaskellWorks.CabalCache.Show

import qualified Data.ByteString.Lazy               as LBS
import qualified Data.ByteString.Lazy.Char8         as LC8
import qualified Data.Text.Encoding                 as T
import qualified HaskellWorks.CabalCache.IO.Console as CIO
import qualified System.IO                          as IO

awsLogger :: Maybe LogLevel -> LogLevel -> LC8.ByteString -> IO ()
awsLogger :: Maybe LogLevel -> LogLevel -> ByteString -> IO ()
awsLogger Maybe LogLevel
maybeConfigLogLevel LogLevel
msgLogLevel ByteString
message =
  Maybe LogLevel -> (LogLevel -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ Maybe LogLevel
maybeConfigLogLevel ((LogLevel -> IO ()) -> IO ()) -> (LogLevel -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \LogLevel
configLogLevel ->
    Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (LogLevel
msgLogLevel LogLevel -> LogLevel -> Bool
forall a. Ord a => a -> a -> Bool
<= LogLevel
configLogLevel) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
      ThreadId
threadId <- IO ThreadId
myThreadId
      Handle -> Text -> IO ()
forall (m :: * -> *). MonadIO m => Handle -> Text -> m ()
CIO.hPutStrLn Handle
IO.stderr (Text -> IO ()) -> Text -> IO ()
forall a b. (a -> b) -> a -> b
$ Text
"[" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> LogLevel -> Text
forall a. Show a => a -> Text
tshow LogLevel
msgLogLevel Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"] [tid: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> ThreadId -> Text
forall a. Show a => a -> Text
tshow ThreadId
threadId Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"]"  Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
text
  where text :: Text
text = ByteString -> Text
T.decodeUtf8 (ByteString -> Text) -> ByteString -> Text
forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString
LBS.toStrict ByteString
message