{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes       #-}
{-# LANGUAGE StrictData        #-}

{-|
Module      : Headroom.UI.Message
Description : UI component for message box
Copyright   : (c) 2019-2022 Vaclav Svejcar
License     : BSD-3-Clause
Maintainer  : vaclav.svejcar@gmail.com
Stability   : experimental
Portability : POSIX

Module providing UI component for message box (info/warning/error).
-}

module Headroom.UI.Message
  ( MessageType(..)
  , Message(..)
  , messageInfo
  , messageWarn
  , messageError
  )
where

import           Data.String.Interpolate             ( i )
import           RIO


-- | Type of the message box (info/warning/error).
data MessageType
  = Info  -- ^ info message type
  | Warn  -- ^ warning message type
  | Error -- ^ error message type
  deriving (MessageType -> MessageType -> Bool
(MessageType -> MessageType -> Bool)
-> (MessageType -> MessageType -> Bool) -> Eq MessageType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MessageType -> MessageType -> Bool
$c/= :: MessageType -> MessageType -> Bool
== :: MessageType -> MessageType -> Bool
$c== :: MessageType -> MessageType -> Bool
Eq, Int -> MessageType -> ShowS
[MessageType] -> ShowS
MessageType -> String
(Int -> MessageType -> ShowS)
-> (MessageType -> String)
-> ([MessageType] -> ShowS)
-> Show MessageType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MessageType] -> ShowS
$cshowList :: [MessageType] -> ShowS
show :: MessageType -> String
$cshow :: MessageType -> String
showsPrec :: Int -> MessageType -> ShowS
$cshowsPrec :: Int -> MessageType -> ShowS
Show)

instance Display MessageType where
  textDisplay :: MessageType -> Text
textDisplay MessageType
Info  = Text
"[i]"
  textDisplay MessageType
Warn  = Text
"[!]"
  textDisplay MessageType
Error = Text
"[x]"


-- | Data type for message box.
data Message = Message MessageType Text
  deriving (Message -> Message -> Bool
(Message -> Message -> Bool)
-> (Message -> Message -> Bool) -> Eq Message
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Message -> Message -> Bool
$c/= :: Message -> Message -> Bool
== :: Message -> Message -> Bool
$c== :: Message -> Message -> Bool
Eq, Int -> Message -> ShowS
[Message] -> ShowS
Message -> String
(Int -> Message -> ShowS)
-> (Message -> String) -> ([Message] -> ShowS) -> Show Message
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Message] -> ShowS
$cshowList :: [Message] -> ShowS
show :: Message -> String
$cshow :: Message -> String
showsPrec :: Int -> Message -> ShowS
$cshowsPrec :: Int -> Message -> ShowS
Show)

instance Display Message where
  textDisplay :: Message -> Text
textDisplay (Message MessageType
tp Text
tx) = [i|#{textDisplay tp} #{tx}|]


-- | Creates 'Message' of type 'Info'.
messageInfo :: Text -> Message
messageInfo :: Text -> Message
messageInfo = MessageType -> Text -> Message
Message MessageType
Info


-- | Creates 'Message' of type 'Warn'.
messageWarn :: Text -> Message
messageWarn :: Text -> Message
messageWarn = MessageType -> Text -> Message
Message MessageType
Warn


-- | Creates 'Message' of type 'Error'.
messageError :: Text -> Message
messageError :: Text -> Message
messageError = MessageType -> Text -> Message
Message MessageType
Error