{-# LANGUAGE DeriveGeneric         #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE RecordWildCards       #-}

module Logging.Types.Handlers.StreamHandler ( StreamHandler(..) ) where

import           Control.Monad           (unless)
import           GHC.Generics
import           System.IO

import           Logging.Types.Class
import           Logging.Types.Filter
import           Logging.Types.Formatter
import           Logging.Types.Level


-- | A handler type which writes logging records, appropriately formatted,
-- to a stream.
--
-- Note that this class does not close the stream when the stream is a
-- terminal device, e.g. 'stderr' and 'stdout'.
--
-- Note: 'FileHandler' is an alias of 'StreamHandler'
data StreamHandler = StreamHandler { stream    :: Handle
                                   , level     :: Level
                                   , filterer  :: Filterer
                                   , formatter :: Formatter
                                   } deriving (Generic, Eq)

instance Handler StreamHandler where
  emit hdl@StreamHandler{..} rcd = do
    hPutStrLn stream $ format formatter rcd
    flush hdl

  flush = hFlush . stream