{- |
 Responses from handlers.
-}
module WebGear.Core.Response (
  -- * Basic Types
  Response (..),
  ResponseBody (..),
  toWaiResponse,
) where

import qualified Data.Binary.Builder as B
import qualified Network.HTTP.Types as HTTP
import qualified Network.Wai as Wai

{- | An HTTP response sent from the server to the client.

The response contains a status, optional headers and an optional
body payload.
-}
data Response = Response
  { Response -> Status
responseStatus :: HTTP.Status
  -- ^ Response status code
  , Response -> ResponseHeaders
responseHeaders :: HTTP.ResponseHeaders
  -- ^ Response headers
  , Response -> ResponseBody
responseBody :: ResponseBody
  -- ^ The response body
  }

data ResponseBody
  = ResponseBodyFile FilePath (Maybe Wai.FilePart)
  | ResponseBodyBuilder B.Builder
  | ResponseBodyStream Wai.StreamingBody

-- | Generate a WAI response
toWaiResponse :: Response -> Wai.Response
toWaiResponse :: Response -> Response
toWaiResponse Response{ResponseHeaders
Status
ResponseBody
responseBody :: ResponseBody
responseHeaders :: ResponseHeaders
responseStatus :: Status
responseBody :: Response -> ResponseBody
responseHeaders :: Response -> ResponseHeaders
responseStatus :: Response -> Status
..} =
  case ResponseBody
responseBody of
    ResponseBodyFile FilePath
fpath Maybe FilePart
fpart ->
      Status -> ResponseHeaders -> FilePath -> Maybe FilePart -> Response
Wai.responseFile Status
responseStatus ResponseHeaders
responseHeaders FilePath
fpath Maybe FilePart
fpart
    ResponseBodyBuilder Builder
builder ->
      Status -> ResponseHeaders -> Builder -> Response
Wai.responseBuilder Status
responseStatus ResponseHeaders
responseHeaders Builder
builder
    ResponseBodyStream StreamingBody
stream ->
      Status -> ResponseHeaders -> StreamingBody -> Response
Wai.responseStream Status
responseStatus ResponseHeaders
responseHeaders StreamingBody
stream