packages feed

ribosome-0.3.0.0: lib/Ribosome/Log.hs

module Ribosome.Log where

import Control.Monad.IO.Class (MonadIO, liftIO)
import Data.ByteString (ByteString)
import qualified Data.ByteString.UTF8 as ByteString (toString)
import Data.Foldable (traverse_)
import Data.Text (Text)
import qualified Data.Text as Text (unpack)
import System.Log.Logger (Priority(DEBUG, ERROR, INFO), logM)

import Ribosome.Control.Monad.Ribo (MonadRibo, pluginName)

class Loggable a where
  logLines :: a -> [String]

instance {-# OVERLAPPABLE #-} Loggable a => Loggable [a] where
  logLines =
    (>>= logLines)

instance {-# OVERLAPPING #-} Loggable String where
  logLines = pure

instance Loggable ByteString where
  logLines = pure . ByteString.toString

instance Loggable Text where
  logLines = pure . Text.unpack

logAs ::
  Loggable a =>
  MonadIO m =>
  Priority ->
  Text ->
  a ->
  m ()
logAs prio name = liftIO . traverse_ (logM (toString name) prio) . logLines

debugAs ::
  Loggable a =>
  MonadIO m =>
  Text ->
  a ->
  m ()
debugAs =
  logAs DEBUG

infoAs ::
  Loggable a =>
  MonadIO m =>
  Text ->
  a ->
  m ()
infoAs =
  logAs INFO

errAs ::
  Loggable a =>
  MonadIO m =>
  Text ->
  a ->
  m ()
errAs =
  logAs ERROR

prefixed :: (MonadIO m, Show a) => Text -> a -> m ()
prefixed prefix a = liftIO $ putStrLn $ prefix <> ": " <> show a

logR ::
  Loggable a =>
  MonadRibo m =>
  Priority ->
  a ->
  m ()
logR prio message = do
  n <- pluginName
  logAs prio n message

debug ::
  Loggable a =>
  MonadRibo m =>
  a ->
  m ()
debug =
  logR DEBUG

logDebug ::
  Loggable a =>
  MonadRibo m =>
  a ->
  m ()
logDebug = debug

showDebug ::
  Show a =>
  MonadRibo m =>
  Text ->
  a ->
  m ()
showDebug prefix a =
  logDebug @Text (prefix <> " " <> show a)

showDebugM ::
  Show a =>
  MonadRibo m =>
  Text ->
  m a ->
  m a
showDebugM prefix ma = do
  a <- ma
  logDebug @Text (prefix <> " " <> show a)
  return a

info ::
  Loggable a =>
  MonadRibo m =>
  a ->
  m ()
info =
  logR INFO

logInfo ::
  Loggable a =>
  MonadRibo m =>
  a ->
  m ()
logInfo = info

err ::
  Loggable a =>
  MonadRibo m =>
  a ->
  m ()
err =
  logR ERROR

logError ::
  Loggable a =>
  MonadRibo m =>
  a ->
  m ()
logError = err

showError ::
  Show a =>
  MonadRibo m =>
  Text ->
  a ->
  m ()
showError prefix a =
  logError @Text (prefix <> " " <> show a)