{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ConstraintKinds #-}
-- |
-- This module is intended to be imported qualified:
--
-- > import qualified System.Logging.Facade as Log
module System.Logging.Facade (
-- * Producing log messages
  log
, trace
, debug
, info
, warn
, error

-- * Types
, Logging
, LogLevel(..)
) where

import           Prelude hiding (log, error)
import           Data.CallStack

import           System.Logging.Facade.Types
import           System.Logging.Facade.Class

-- | Produce a log message with specified log level.
log :: (HasCallStack, Logging m) => LogLevel -> String -> m ()
log level message = consumeLogRecord (LogRecord level location message)

location :: HasCallStack => Maybe Location
location = case reverse callStack of
  (_, loc) : _ -> Just $ Location (srcLocPackage loc) (srcLocModule loc) (srcLocFile loc) (srcLocStartLine loc) (srcLocStartCol loc)
  _ -> Nothing

-- | Produce a log message with log level `TRACE`.
trace :: (HasCallStack, Logging m) => String -> m ()
trace = log TRACE

-- | Produce a log message with log level `DEBUG`.
debug :: (HasCallStack, Logging m) => String -> m ()
debug = log DEBUG

-- | Produce a log message with log level `INFO`.
info :: (HasCallStack, Logging m) => String -> m ()
info = log INFO

-- | Produce a log message with log level `WARN`.
warn :: (HasCallStack, Logging m) => String -> m ()
warn = log WARN

-- | Produce a log message with log level `ERROR`.
error :: (HasCallStack, Logging m) => String -> m ()
error = log ERROR