{-# 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
        , Monad m
        ) => j
          -> FileExtListenerT urlbase m ()
json :: forall j (m :: * -> *) urlbase.
(ToJSON j, Monad m) =>
j -> FileExtListenerT urlbase m ()
json =
  forall (m :: * -> *) urlbase a.
Monad m =>
[FileExt]
-> (ResponseVia -> ResponseVia)
-> FileExtListenerT urlbase m a
-> FileExtListenerT urlbase m a
overFileExts [FileExt
Json] ((ResponseHeaders -> ResponseHeaders) -> ResponseVia -> ResponseVia
mapHeaders ((HeaderName
"Content-Type",ByteString
"application/json")forall a. a -> [a] -> [a]
:))
    forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) urlbase.
Monad m =>
FileExt -> ByteString -> FileExtListenerT urlbase m ()
bytestring FileExt
Json forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ToJSON a => a -> ByteString
A.encode

{-# INLINEABLE json #-}

-- * Data Only

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

{-# INLINEABLE jsonOnly #-}