packages feed

salvia-0.1: src/Network/Salvia/Handler/MethodRouter.hs

module Network.Salvia.Handler.MethodRouter (
    hMethod
  , hMethodRouter

  , hOPTIONS
  , hGET
  , hHEAD
  , hPOST
  , hPUT
  , hDELETE
  , hTRACE
  , hCONNECT
  ) where

import Data.Record.Label
import Network.Protocol.Http
import Network.Salvia.Handler.Dispatching
import Network.Salvia.Handler.Error
import Network.Salvia.Httpd

{- |
Request dispatcher based on the HTTP request `Method`. When the method does not
match an HTTP `NotFound` will be created and `Nothing` will be returned.
-}

hMethod :: Method -> Handler a -> Handler (Maybe a)
hMethod m h = hMethod' m
  (Just `fmap` h)
  (const Nothing `fmap` hError NotFound)

{- | Request list dispatcher based on the `hMethod` dispatcher. -}

hMethodRouter :: ListDispatcher Method ()
hMethodRouter = hListDispatch hMethod'

{- | Only invoke a handler on an `OPTIONS` request. -}

hOPTIONS :: Handler a -> Handler (Maybe a)
hOPTIONS = hMethod OPTIONS

{- | Only invoke a handler on a `GET` request. -}

hGET :: Handler a -> Handler (Maybe a)
hGET = hMethod GET

{- | Only invoke a handler on a `HEAD` request. -}

hHEAD :: Handler a -> Handler (Maybe a)
hHEAD = hMethod HEAD

{- | Only invoke a handler on a `POST` request. -}

hPOST :: Handler a -> Handler (Maybe a)
hPOST = hMethod POST

{- | Only invoke a handler on a `PUT` request. -}

hPUT :: Handler a -> Handler (Maybe a)
hPUT = hMethod PUT

{- | Only invoke a handler on a `DELETE` request. -}

hDELETE :: Handler a -> Handler (Maybe a)
hDELETE = hMethod DELETE

{- | Only invoke a handler on a `TRACE` request. -}

hTRACE :: Handler a -> Handler (Maybe a)
hTRACE = hMethod TRACE

{- | Only invoke a handler on a `CONNECT` request. -}

hCONNECT :: Handler a -> Handler (Maybe a)
hCONNECT = hMethod CONNECT

hMethod' :: Dispatcher Method a
hMethod' = hDispatch (method % request) (==)