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