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

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

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

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


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

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