{-# LANGUAGE TemplateHaskell #-}

module IdeSession.Util.Logger
  ( LogFunc
  , logDebug
  , logInfo
  , logWarn
  , logError
  , logOther
  ) where

import qualified Control.Monad.Logger as L
import           Data.Text (Text)
import           Language.Haskell.TH

type LogFunc = L.Loc -> L.LogSource -> L.LogLevel -> L.LogStr -> IO ()

logDebug :: Q Exp
logDebug = [| \msg -> L.runLoggingT ($(L.logDebug) msg) $(varE (mkName "logFunc")) |]

logInfo :: Q Exp
logInfo = [| \msg -> L.runLoggingT ($(L.logInfo) msg) $(varE (mkName "logFunc")) |]

logWarn :: Q Exp
logWarn = [| \msg -> L.runLoggingT ($(L.logWarn) msg) $(varE (mkName "logFunc")) |]

logError :: Q Exp
logError = [| \msg -> L.runLoggingT ($(L.logError) msg) $(varE (mkName "logFunc")) |]

logOther :: Text -> Q Exp
logOther level = [| \msg -> L.runLoggingT ($(L.logOther level) msg) $(varE (mkName "logFunc")) |]