-- |Representation of HTTP requests.
module Web.Route.Invertible.Request
  ( Request(..)
  , blankRequest
  ) where

import Web.Route.Invertible.Host
import Web.Route.Invertible.Method
import Web.Route.Invertible.Path
import Web.Route.Invertible.Query
import Web.Route.Invertible.ContentType

-- |A reduced representation of an HTTP request, sufficient for routing.
-- This lets us both pre-process/parse the request to optimize routing, and be agnostic about the incoming request representation.
-- These can be created with one of the framework-specific layers.
data Request = Request
  { Request -> Bool
requestSecure :: Bool
  , Request -> [HostString]
requestHost :: [HostString]
  , Request -> Method
requestMethod :: Method
  , Request -> [PathString]
requestPath :: [PathString]
  , Request -> QueryParams
requestQuery :: QueryParams
  , Request -> HostString
requestContentType :: ContentType
  } deriving (Int -> Request -> ShowS
[Request] -> ShowS
Request -> String
(Int -> Request -> ShowS)
-> (Request -> String) -> ([Request] -> ShowS) -> Show Request
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Request] -> ShowS
$cshowList :: [Request] -> ShowS
show :: Request -> String
$cshow :: Request -> String
showsPrec :: Int -> Request -> ShowS
$cshowsPrec :: Int -> Request -> ShowS
Show, Request -> Request -> Bool
(Request -> Request -> Bool)
-> (Request -> Request -> Bool) -> Eq Request
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Request -> Request -> Bool
$c/= :: Request -> Request -> Bool
== :: Request -> Request -> Bool
$c== :: Request -> Request -> Bool
Eq)

-- |A blank/unknown request; effectively the default value
blankRequest :: Request
blankRequest :: Request
blankRequest = Request :: Bool
-> [HostString]
-> Method
-> [PathString]
-> QueryParams
-> HostString
-> Request
Request
  { requestSecure :: Bool
requestSecure = Bool
False
  , requestHost :: [HostString]
requestHost = []
  , requestMethod :: Method
requestMethod = HostString -> Method
ExtensionMethod HostString
forall a. Monoid a => a
mempty
  , requestPath :: [PathString]
requestPath = []
  , requestQuery :: QueryParams
requestQuery = QueryParams
forall a. Monoid a => a
mempty
  , requestContentType :: HostString
requestContentType = HostString
forall a. Monoid a => a
mempty
  }