packages feed

salvia-0.0.5: src/Network/Salvia/Handlers/Log.hs

module Network.Salvia.Handlers.Log (hLog) where

import Control.Concurrent.STM
import Control.Monad.State
import Data.Record.Label
import Misc.Terminal (red, green, reset)
import Network.Protocol.Http
import Network.Salvia.Httpd  (Handler, request, response, address)
import System.IO

-- TODO: handle should be tvar as well
hLog :: TVar Int -> Handle -> Handler Handle
hLog count handle = do
  c    <- lift $ atomically $ readTVar count
  mt   <- getM (method % request)
  ur   <- getM (uri    % request)
  st   <- getM (status % response)
  addr <- getM address
  let code = codeFromStatus st
      clr  = if code >= 400 then red else green
  lift $ hPutStrLn handle $ concat [
      concat ["[", show addr, "] ", show c, "\t"]
    , show mt, "\t"
    , show ur, " -> "
    , clr
    , show code, " "
    , show st
    , reset
    ]
  return handle