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

module Logging.Handler.StreamHandler ( StreamHandler(..) ) where

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

import           Logging.Class
import           Logging.Filter
import           Logging.Level


-- | A handler type which writes logging records, appropriately formatted,
-- to a stream.
--
data StreamHandler = StreamHandler { level     :: Level
                                   , filterer  :: Filterer
                                   , formatter :: Format1
                                   , stream    :: Handle
                                   -- ^ Must be writable 'Handle'
                                   } deriving (Generic, Eq)

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