-- This Source Code Form is subject to the terms of the Mozilla Public
-- License, v. 2.0. If a copy of the MPL was not distributed with this
-- file, You can obtain one at http://mozilla.org/MPL/2.0/.

module Network.Wai.Routing.Request
    ( RoutingReq
    , HasCaptures (..)
    , fromReq
    , lookupCapture
    ) where

import Data.ByteString (ByteString)
import Network.Wai.Predicate.Request

class HasCaptures a where
     captures :: a -> [(ByteString, ByteString)]

data RoutingReq = RoutingReq
    { RoutingReq -> [(ByteString, ByteString)]
_captures :: [(ByteString, ByteString)]
    , RoutingReq -> Req
_request  :: Req
    }

instance HasRequest RoutingReq where
    getRequest :: RoutingReq -> Request
getRequest = Req -> Request
forall a. HasRequest a => a -> Request
getRequest (Req -> Request) -> (RoutingReq -> Req) -> RoutingReq -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RoutingReq -> Req
_request

instance HasMethod RoutingReq where
    method :: RoutingReq -> ByteString
method = Req -> ByteString
forall a. HasMethod a => a -> ByteString
method (Req -> ByteString)
-> (RoutingReq -> Req) -> RoutingReq -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RoutingReq -> Req
_request

instance HasHeaders RoutingReq where
    headers :: RoutingReq -> RequestHeaders
headers = Req -> RequestHeaders
forall a. HasHeaders a => a -> RequestHeaders
headers (Req -> RequestHeaders)
-> (RoutingReq -> Req) -> RoutingReq -> RequestHeaders
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RoutingReq -> Req
_request

instance HasCookies RoutingReq where
    cookies :: RoutingReq -> [(ByteString, ByteString)]
cookies = Req -> [(ByteString, ByteString)]
forall a. HasCookies a => a -> [(ByteString, ByteString)]
cookies (Req -> [(ByteString, ByteString)])
-> (RoutingReq -> Req) -> RoutingReq -> [(ByteString, ByteString)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RoutingReq -> Req
_request

instance HasQuery RoutingReq where
    queryItems :: RoutingReq -> Query
queryItems = Req -> Query
forall a. HasQuery a => a -> Query
queryItems (Req -> Query) -> (RoutingReq -> Req) -> RoutingReq -> Query
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RoutingReq -> Req
_request

instance HasPath RoutingReq where
    segments :: RoutingReq -> Vector ByteString
segments = Req -> Vector ByteString
forall a. HasPath a => a -> Vector ByteString
segments (Req -> Vector ByteString)
-> (RoutingReq -> Req) -> RoutingReq -> Vector ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RoutingReq -> Req
_request

instance HasCaptures RoutingReq where
    captures :: RoutingReq -> [(ByteString, ByteString)]
captures = RoutingReq -> [(ByteString, ByteString)]
_captures

instance HasVault RoutingReq where
    requestVault :: RoutingReq -> Vault
requestVault = Req -> Vault
forall a. HasVault a => a -> Vault
requestVault (Req -> Vault) -> (RoutingReq -> Req) -> RoutingReq -> Vault
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RoutingReq -> Req
_request

fromReq :: [(ByteString, ByteString)] -> Req -> RoutingReq
fromReq :: [(ByteString, ByteString)] -> Req -> RoutingReq
fromReq = [(ByteString, ByteString)] -> Req -> RoutingReq
RoutingReq

lookupCapture :: (HasCaptures r) => ByteString -> r -> [ByteString]
lookupCapture :: forall r. HasCaptures r => ByteString -> r -> [ByteString]
lookupCapture ByteString
name = ((ByteString, ByteString) -> ByteString)
-> [(ByteString, ByteString)] -> [ByteString]
forall a b. (a -> b) -> [a] -> [b]
map (ByteString, ByteString) -> ByteString
forall a b. (a, b) -> b
snd ([(ByteString, ByteString)] -> [ByteString])
-> (r -> [(ByteString, ByteString)]) -> r -> [ByteString]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((ByteString, ByteString) -> Bool)
-> [(ByteString, ByteString)] -> [(ByteString, ByteString)]
forall a. (a -> Bool) -> [a] -> [a]
filter ((ByteString
name ByteString -> ByteString -> Bool
forall a. Eq a => a -> a -> Bool
==) (ByteString -> Bool)
-> ((ByteString, ByteString) -> ByteString)
-> (ByteString, ByteString)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ByteString, ByteString) -> ByteString
forall a b. (a, b) -> a
fst) ([(ByteString, ByteString)] -> [(ByteString, ByteString)])
-> (r -> [(ByteString, ByteString)])
-> r
-> [(ByteString, ByteString)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. r -> [(ByteString, ByteString)]
forall a. HasCaptures a => a -> [(ByteString, ByteString)]
captures