{-# LANGUAGE OverloadedStrings #-}
module Network.QUIC.Logger (
Builder,
DebugLogger,
bhow,
stdoutLogger,
dirDebugLogger,
) where
import Data.ByteString.Builder (byteString, toLazyByteString)
import qualified Data.ByteString.Char8 as C8
import qualified Data.ByteString.Lazy.Char8 as BL
import System.FilePath
import System.Log.FastLogger
import Network.QUIC.Imports
import Network.QUIC.Types
type DebugLogger = Builder -> IO ()
bhow :: Show a => a -> Builder
bhow :: forall a. Show a => a -> Builder
bhow = ByteString -> Builder
byteString (ByteString -> Builder) -> (a -> ByteString) -> a -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ByteString
C8.pack (String -> ByteString) -> (a -> String) -> a -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String
forall a. Show a => a -> String
show
stdoutLogger :: DebugLogger
stdoutLogger :: DebugLogger
stdoutLogger Builder
b = ByteString -> IO ()
BL.putStrLn (ByteString -> IO ()) -> ByteString -> IO ()
forall a b. (a -> b) -> a -> b
$ Builder -> ByteString
toLazyByteString Builder
b
dirDebugLogger :: Maybe FilePath -> CID -> IO (DebugLogger, IO ())
dirDebugLogger :: Maybe String -> CID -> IO (DebugLogger, IO ())
dirDebugLogger Maybe String
Nothing CID
_ = do
let dLog :: p -> m ()
dLog ~p
_ = () -> m ()
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
clean :: IO ()
clean = () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
(DebugLogger, IO ()) -> IO (DebugLogger, IO ())
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (DebugLogger
forall {m :: * -> *} {p}. Monad m => p -> m ()
dLog, IO ()
clean)
dirDebugLogger (Just String
dir) CID
cid = do
let file :: String
file = String
dir String -> String -> String
</> (CID -> String
forall a. Show a => a -> String
show CID
cid String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
".txt")
(LogStr -> IO ()
fastlogger, IO ()
clean) <- LogType' LogStr -> IO (LogStr -> IO (), IO ())
forall v. LogType' v -> IO (v -> IO (), IO ())
newFastLogger1 (String -> BufSize -> LogType' LogStr
LogFileNoRotate String
file BufSize
4096)
let dLog :: DebugLogger
dLog Builder
msg = do
LogStr -> IO ()
fastlogger (Builder -> LogStr
forall msg. ToLogStr msg => msg -> LogStr
toLogStr Builder
msg LogStr -> LogStr -> LogStr
forall a. Semigroup a => a -> a -> a
<> LogStr
"\n")
DebugLogger
stdoutLogger Builder
msg
(DebugLogger, IO ()) -> IO (DebugLogger, IO ())
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (DebugLogger
dLog, IO ()
clean)