module Logging.Class.Message ( IsMessage(..) ) where

import           Control.Exception
import           Data.Aeson
import qualified Data.ByteString.Char8      as B8
import qualified Data.ByteString.Lazy.Char8 as LB8
import           Data.List                  (intercalate)
import qualified Data.Text                  as T
import qualified Data.Text.Lazy             as LT

{-| A class for datatypes that can be converted to log message.

@since 0.8.0
-}
class IsMessage a where
  toMessage :: a -> String

  toMessageList :: [a] -> String
  toMessageList [] = ""
  toMessageList xs = "[" ++ (intercalate "," $ map toMessage xs) ++ "]"

instance IsMessage Char where
  toMessage = (: "")
  toMessageList = id

instance IsMessage B8.ByteString where
  toMessage = B8.unpack

instance IsMessage LB8.ByteString where
  toMessage = LB8.unpack

instance IsMessage T.Text where
  toMessage = T.unpack

instance IsMessage LT.Text where
  toMessage = LT.unpack

instance IsMessage Value where
  toMessage = toMessage . encode

instance IsMessage SomeException where
  toMessage = show

instance IsMessage a => IsMessage [a] where
  {-# SPECIALIZE instance IsMessage [Char] #-}
  toMessage = toMessageList