packages feed

disco-0.1.6: src/Disco/Messages.hs

{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE TemplateHaskell #-}

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

-- |
-- Module      :  Disco.Messages
-- Copyright   :  disco team and contributors
-- Maintainer  :  byorgey@gmail.com
--
-- SPDX-License-Identifier: BSD-3-Clause
--
-- Message logging framework (e.g. for errors, warnings, etc.) for
-- disco.
module Disco.Messages where

import Control.Lens
import Control.Monad (when)
import Polysemy
import Polysemy.Output

import Disco.Pretty (Doc, Pretty, pretty', renderDoc')

data MessageType
  = Info
  | Warning
  | ErrMsg
  | Debug
  deriving (Show, Read, Eq, Ord, Enum, Bounded)

data Message ann = Message {_messageType :: MessageType, _message :: (Doc ann)}
  deriving (Show)

makeLenses ''Message

handleMsg :: Member (Embed IO) r => (Message ann -> Bool) -> Message ann -> Sem r ()
handleMsg p m = when (p m) $ printMsg m

printMsg :: Member (Embed IO) r => Message ann -> Sem r ()
printMsg (Message _ m) = embed $ putStrLn (renderDoc' m)

msg :: Member (Output (Message ann)) r => MessageType -> Sem r (Doc ann) -> Sem r ()
msg typ m = m >>= output . Message typ

info :: Member (Output (Message ann)) r => Sem r (Doc ann) -> Sem r ()
info = msg Info

infoPretty :: (Member (Output (Message ann)) r, Pretty t) => t -> Sem r ()
infoPretty = info . pretty'

warn :: Member (Output (Message ann)) r => Sem r (Doc ann) -> Sem r ()
warn = msg Warning

debug :: Member (Output (Message ann)) r => Sem r (Doc ann) -> Sem r ()
debug = msg Debug

debugPretty :: (Member (Output (Message ann)) r, Pretty t) => t -> Sem r ()
debugPretty = debug . pretty'

err :: Member (Output (Message ann)) r => Sem r (Doc ann) -> Sem r ()
err = msg ErrMsg