{-|
Module: MQTT.Logger
Copyright: Lukas Braun 2014
License: GPL-3
Maintainer: koomi+mqtt@hackerspace-bamberg.de

A simple logger abstraction.
-}
module Network.MQTT.Logger where

import System.IO

-- | Absract logger with three levels of importance.
data Logger
    = Logger
        { logInfo :: String -> IO ()
        , logWarning :: String -> IO ()
        , logError :: String -> IO ()
        }

-- | 'logInfo' prints to stdout, 'logWarning' and 'logError' to stderr
-- (with [Warning]/[Error] prefix)
stdLogger :: Logger
stdLogger = Logger
              putStrLn
              (\msg -> hPutStrLn stderr $ "[Warning] " ++ msg)
              (\msg -> hPutStrLn stderr $ "[Error] " ++ msg)

-- | Log only warnings and errors, ignoring anything passed to 'logInfo'.
warnings :: Logger -> Logger
warnings l = l { logInfo = ignore }

-- | Like 'warnings', but logs only errors.
errors :: Logger -> Logger
errors l = l { logInfo = ignore, logWarning = ignore }

-- | Ignore the message.
ignore :: String -> IO ()
ignore _ = return ()