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

import Data.ByteString (ByteString)
import qualified Data.ByteString.Lazy as LBS
import qualified Data.HashMap.Strict as HM
import Data.Maybe (fromMaybe)
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 code
    Response -> Status
responseStatus :: HTTP.Status
  , -- | Response headers
    Response -> HashMap HeaderName ByteString
responseHeaders :: HM.HashMap HTTP.HeaderName ByteString
  , -- | Optional response body
    Response -> Maybe ByteString
responseBody :: Maybe LBS.ByteString
  }
  deriving stock (Response -> Response -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Response -> Response -> Bool
$c/= :: Response -> Response -> Bool
== :: Response -> Response -> Bool
$c== :: Response -> Response -> Bool
Eq, Eq Response
Response -> Response -> Bool
Response -> Response -> Ordering
Response -> Response -> Response
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Response -> Response -> Response
$cmin :: Response -> Response -> Response
max :: Response -> Response -> Response
$cmax :: Response -> Response -> Response
>= :: Response -> Response -> Bool
$c>= :: Response -> Response -> Bool
> :: Response -> Response -> Bool
$c> :: Response -> Response -> Bool
<= :: Response -> Response -> Bool
$c<= :: Response -> Response -> Bool
< :: Response -> Response -> Bool
$c< :: Response -> Response -> Bool
compare :: Response -> Response -> Ordering
$ccompare :: Response -> Response -> Ordering
Ord, Int -> Response -> ShowS
[Response] -> ShowS
Response -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Response] -> ShowS
$cshowList :: [Response] -> ShowS
show :: Response -> String
$cshow :: Response -> String
showsPrec :: Int -> Response -> ShowS
$cshowsPrec :: Int -> Response -> ShowS
Show)

-- | Generate a WAI response
toWaiResponse :: Response -> Wai.Response
toWaiResponse :: Response -> Response
toWaiResponse Response{Maybe ByteString
HashMap HeaderName ByteString
Status
responseBody :: Maybe ByteString
responseHeaders :: HashMap HeaderName ByteString
responseStatus :: Status
responseBody :: Response -> Maybe ByteString
responseHeaders :: Response -> HashMap HeaderName ByteString
responseStatus :: Response -> Status
..} =
  Status -> ResponseHeaders -> ByteString -> Response
Wai.responseLBS Status
responseStatus (forall k v. HashMap k v -> [(k, v)]
HM.toList HashMap HeaderName ByteString
responseHeaders) (forall a. a -> Maybe a -> a
fromMaybe ByteString
"" Maybe ByteString
responseBody)