{-# LANGUAGE OverloadedStrings #-}


module Web.Routes.Nested.FileExtListener.Json where

import           Web.Routes.Nested.FileExtListener.Types

import qualified Data.Aeson                              as A
import           Data.Map
import           Network.HTTP.Types                      (RequestHeaders,
                                                          Status, status200)
import           Network.Wai

import           Control.Monad.Writer




json :: ( A.ToJSON j
        , Monad m ) =>
        j -> FileExtListenerT Response m ()
json i =
  let r = responseLBS status200 [("Content-Type", "application/json")] $
            A.encode i in
  FileExtListenerT $ tell $
    FileExts $ singleton Json r

jsonStatus :: ( A.ToJSON j
        , Monad m ) =>
        Status -> j -> FileExtListenerT Response m ()
jsonStatus s i =
  let r = responseLBS s [("Content-Type", "application/json")] $
            A.encode i in
  FileExtListenerT $ tell $
    FileExts $ singleton Json r

jsonp :: ( A.ToJSON j
        , Monad m ) =>
        j -> FileExtListenerT Response m ()
jsonp i =
  let r = responseLBS status200 [("Content-Type", "application/javascript")] $
            A.encode i in
  FileExtListenerT $ tell $
    FileExts $ singleton Json r

jsonpStatus :: ( A.ToJSON j
        , Monad m ) =>
        Status -> j -> FileExtListenerT Response m ()
jsonpStatus s i =
  let r = responseLBS s [("Content-Type", "application/javascript")] $
            A.encode i in
  FileExtListenerT $ tell $
    FileExts $ singleton Json r

jsonHeaders :: ( A.ToJSON j
        , Monad m ) =>
        RequestHeaders -> j -> FileExtListenerT Response m ()
jsonHeaders hs i =
  let r = responseLBS status200 hs $
            A.encode i in
  FileExtListenerT $ tell $
    FileExts $ singleton Json r

jsonStatusHeaders :: ( A.ToJSON j
        , Monad m ) =>
        Status -> RequestHeaders -> j -> FileExtListenerT Response m ()
jsonStatusHeaders s hs i =
  let r = responseLBS s hs $
            A.encode i in
  FileExtListenerT $ tell $
    FileExts $ singleton Json r




jsonOnly :: A.ToJSON j =>
            j -> Response
jsonOnly i =
  responseLBS status200 [("Content-Type", "application/json")] $ A.encode i

jsonOnlyStatus :: A.ToJSON j =>
            Status -> j -> Response
jsonOnlyStatus s i =
  responseLBS s [("Content-Type", "application/json")] $ A.encode i

jsonpOnly :: A.ToJSON j =>
            j -> Response
jsonpOnly i =
  responseLBS status200 [("Content-Type", "application/javascript")] $ A.encode i

jsonpOnlyStatus :: A.ToJSON j =>
            Status -> j -> Response
jsonpOnlyStatus s i =
  responseLBS s [("Content-Type", "application/javascript")] $ A.encode i

jsonOnlyHeaders :: A.ToJSON j =>
            RequestHeaders -> j -> Response
jsonOnlyHeaders hs i =
  responseLBS status200 hs $ A.encode i

jsonOnlyStatusHeaders :: A.ToJSON j =>
            Status -> RequestHeaders -> j -> Response
jsonOnlyStatusHeaders s hs i =
  responseLBS s hs $ A.encode i