module Network.Wai.Middleware.ContentType.ByteString where

import           Network.Wai.Middleware.ContentType.Types (FileExtListenerT, tell', getLogger, FileExt, ResponseVia (..))
import           Network.HTTP.Types                      (status200, Status, ResponseHeaders)
import           Network.Wai                             (Response, responseLBS)

import qualified Data.ByteString.Lazy                    as LBS
import qualified Data.HashMap.Lazy                       as HM
import           Control.Monad.IO.Class (MonadIO (..))


-- * Lifted Combinators

bytestring :: MonadIO m =>
              FileExt
           -> LBS.ByteString
           -> FileExtListenerT m ()
bytestring fe i = do
  aplogger <- getLogger
  liftIO $ aplogger status200 (Just $ fromIntegral $ LBS.length i)
  tell' $ HM.singleton fe $
    ResponseVia
      i
      status200
      []
      bytestringOnly

{-# INLINEABLE bytestring #-}


-- * Data Only

-- | The exact same thing as @Network.Wai.responseLBS@.
bytestringOnly :: LBS.ByteString -> Status -> ResponseHeaders -> Response
bytestringOnly b s hs = responseLBS s hs b