module Network.Wai.Controller
( Controller
, request
, body
, queryParam
, parseForm
, respond
) where
import Control.Monad.Reader
import qualified Data.ByteString.Char8 as S8
import qualified Data.ByteString.Lazy.Char8 as L8
import Data.Conduit
import Data.Conduit.List as CL
import Network.Wai
import Network.Wai.Parse
import Network.Wai.Router
data ControllerState = ControllerState { csRequest :: Request }
type Controller = ReaderT ControllerState (ResourceT IO)
instance Routeable (Controller Response) where
runRoute controller req = fmap Just $
runReaderT controller $ ControllerState req
request :: Controller Request
request = fmap csRequest ask
queryParam :: S8.ByteString -> Controller (Maybe S8.ByteString)
queryParam varName = do
qr <- fmap queryString request
case lookup varName qr of
Just n -> return n
_ -> return Nothing
respond :: Routeable r => r -> Controller r
respond = return
body :: Controller L8.ByteString
body = do
bd <- fmap requestBody request
lift $ bd $$ (CL.consume >>= return . L8.fromChunks)
parseForm :: Controller ([Param], [File FilePath])
parseForm = do
request >>= lift . (parseRequestBody tempFileBackEnd)