{-# LANGUAGE
    OverloadedStrings
  #-}

module Network.Wai.Middleware.ContentType.Json where

import           Network.Wai.Middleware.ContentType.Types (FileExtListenerT, FileExt (Json), mapHeaders, overFileExts)
import           Network.Wai.Middleware.ContentType.ByteString (bytestringOnly, bytestring)
import           Network.HTTP.Types                      (Status, ResponseHeaders)
import           Network.Wai                             (Response)

import qualified Data.Aeson                              as A
import           Control.Monad.IO.Class (MonadIO (..))



-- * Lifted Combinators

json :: ( A.ToJSON j
        , MonadIO m
        ) => j
          -> FileExtListenerT m ()
json =
  overFileExts [Json] (mapHeaders (("Content-Type","application/json"):))
    . bytestring Json . A.encode

{-# INLINEABLE json #-}

-- * Data Only

jsonOnly :: A.ToJSON j => j -> Status -> ResponseHeaders -> Response
jsonOnly j =
  bytestringOnly (A.encode j)

{-# INLINEABLE jsonOnly #-}