apiary-0.4.0.0: src/Control/Monad/Apiary/Filter.hs
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE DataKinds #-}
module Control.Monad.Apiary.Filter
( method, stdMethod, root
, ssl
, hasQuery
, queryAll, queryAll', queryFirst, queryFirst'
, function, function'
-- * Reexport
, StdMethod(..)
) where
import Control.Monad
import Network.Wai
import Network.HTTP.Types
import qualified Data.ByteString as S
import Data.Maybe
import Control.Monad.Apiary.Action.Internal
import Control.Monad.Apiary.Internal
-- | raw and most generic filter function.
function :: Monad m => (SList c -> Request -> Maybe (SList c')) -> ApiaryT c' m b -> ApiaryT c m b
function f = focus $ \c -> getRequest >>= \r -> case f c r of
Nothing -> mzero
Just c' -> return c'
-- | filter and append argument.
function' :: Monad m => (Request -> Maybe a) -> ApiaryT (Snoc as a) m b -> ApiaryT as m b
function' f = function $ \c r -> sSnoc c `fmap` f r
-- | filter only(not modify arguments).
function_ :: Monad m => (Request -> Bool) -> ApiaryT c m b -> ApiaryT c m b
function_ f = function $ \c r -> if f r then Just c else Nothing
ssl :: Monad m => ApiaryT c m a -> ApiaryT c m a
ssl = function_ isSecure
-- | filter by query parameter. since 0.4.0.0.
queryAll :: Monad m => S.ByteString
-> ApiaryT (Snoc as [Maybe S.ByteString]) m b -- ^ Nothing == no value paramator.
-> ApiaryT as m b
queryAll q = function' $ \r -> case filter ((q ==) . fst) $ queryString r of
[] -> Nothing
as -> Just $ map snd as
-- | filter by query parameter. since 0.4.0.0.
queryAll' :: Monad m => S.ByteString
-> ApiaryT (Snoc as [S.ByteString]) m b
-> ApiaryT as m b
queryAll' q = function' $ \r -> case mapMaybe snd . filter ((q ==) . fst) $ queryString r of
[] -> Nothing
as -> Just as
-- | filter by query parameter. since 0.4.0.0.
queryFirst :: Monad m => S.ByteString
-> ApiaryT (Snoc as (Maybe S.ByteString)) m b
-> ApiaryT as m b
queryFirst q = function' (lookup q . queryString)
-- | filter by query parameter. since 0.4.0.0.
queryFirst' :: Monad m => S.ByteString
-> ApiaryT (Snoc as S.ByteString) m b
-> ApiaryT as m b
queryFirst' q = function' $ \r -> case mapMaybe snd . filter ((q ==) . fst) $ queryString r of
[] -> Nothing
a:_ -> Just a
hasQuery :: Monad m => S.ByteString -> ApiaryT c m a -> ApiaryT c m a
hasQuery q = function_ (any ((q ==) . fst) . queryString)
method :: Monad m => Method -> ApiaryT c m a -> ApiaryT c m a
method m = function_ ((m ==) . requestMethod)
stdMethod :: Monad m => StdMethod -> ApiaryT c m a -> ApiaryT c m a
stdMethod = method . renderStdMethod
-- | filter by 'Control.Monad.Apiary.Action.rootPattern' of 'Control.Monad.Apiary.Action.ApiaryConfig'.
root :: Monad m => ApiaryT c m b -> ApiaryT c m b
root m = do
rs <- rootPattern `liftM` apiaryConfig
function_ (\r -> rawPathInfo r `elem` rs) m