{- |
Module:      PFile.Log
Copyright:   (c) 2024 Illia Shkroba
License:     BSD3
Maintainer:  Illia Shkroba <is@pjwstk.edu.pl>
Stability:   unstable
Portability: non-portable (Non-Unix systems are not supported)

Types and functions for logging.
-}

{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE NamedFieldPuns    #-}
{-# LANGUAGE OverloadedStrings #-}

module PFile.Log
  ( info
  , warning
  , error
  , panic
  ) where

import           PFile.Env (Env (..))
import           Protolude hiding (panic, print)

info :: (MonadReader Env m, MonadIO m) => Text -> m ()
info :: forall (m :: * -> *).
(MonadReader Env m, MonadIO m) =>
Text -> m ()
info Text
message = do
  Env {Text -> IO ()
print :: Text -> IO ()
print :: Env -> Text -> IO ()
print} <- m Env
forall r (m :: * -> *). MonadReader r m => m r
ask
  IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ Text -> IO ()
print (Text -> IO ()) -> Text -> IO ()
forall a b. (a -> b) -> a -> b
$ Text
"[INFO] " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
message

warning :: (MonadReader Env m, MonadIO m) => Text -> m ()
warning :: forall (m :: * -> *).
(MonadReader Env m, MonadIO m) =>
Text -> m ()
warning Text
message = do
  Env {Text -> IO ()
print :: Env -> Text -> IO ()
print :: Text -> IO ()
print} <- m Env
forall r (m :: * -> *). MonadReader r m => m r
ask
  IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ Text -> IO ()
print (Text -> IO ()) -> Text -> IO ()
forall a b. (a -> b) -> a -> b
$ Text
"[WARNING] " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
message

error :: MonadIO m => Text -> m ()
error :: forall (m :: * -> *). MonadIO m => Text -> m ()
error = Text -> m ()
forall a (m :: * -> *). (Print a, MonadIO m) => a -> m ()
forall (m :: * -> *). MonadIO m => Text -> m ()
putErrLn

panic :: MonadIO m => Text -> m a
panic :: forall (m :: * -> *) a. MonadIO m => Text -> m a
panic Text
message = Text -> m ()
forall (m :: * -> *). MonadIO m => Text -> m ()
error Text
message m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> IO a -> m a
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO a
forall a. IO a
exitFailure