{-# LANGUAGE FlexibleContexts #-}
module Network.Salvia.Handler.Path
  ( hPath
  , hPathRouter
  , hPrefix
  , hPrefixRouter

  , hQueryParameters
  )
where

import Control.Category
import Data.List
import Data.Record.Label
import Network.Protocol.Http
import Network.Protocol.Uri
import Network.Salvia.Interface
import Network.Salvia.Handler.Dispatching
import Network.Salvia.Handler.Rewrite
import Prelude hiding ((.), id)

{- | Request dispatcher based on the request path. -}

hPath :: HttpM Request m => Dispatcher String m a
hPath p h = hRequestDispatch (path . asUri) (==) p (chop p h)

{- | List dispatcher version of `hPath`. -}

hPathRouter :: HttpM Request m => ListDispatcher String m a
hPathRouter = hListDispatch hPath

{- | Request dispatcher based on a prefix of the request path. -}

hPrefix :: HttpM Request m => Dispatcher String m a
hPrefix p h = hRequestDispatch (path . asUri) isPrefixOf p (chop p h)

{- | List dispatcher version of `hPrefix`. -}

hPrefixRouter :: HttpM Request m => ListDispatcher String m a
hPrefixRouter = hListDispatch hPrefix

{- | Helper function to fetch the URI parameters from the request. -}

hQueryParameters :: HttpM Request m => m Parameters
hQueryParameters = request (getM (queryParams . asUri))

-- Helper.

chop :: HttpM Request m => String -> m a -> m a
chop a = hLocalRequest (path . asUri) (drop (length a))