{-# LANGUAGE OverloadedStrings #-} module Web.Scotty.Action ( request, body, param, jsonData , status, header, redirect , text, html, file, json , raise, rescue, next , ActionM, Parsable, Param, runAction ) where import Blaze.ByteString.Builder (fromLazyByteString) import Control.Applicative import Control.Monad.Error import Control.Monad.Reader import qualified Control.Monad.State as MS import qualified Data.Aeson as A import qualified Data.ByteString.Char8 as B import qualified Data.ByteString.Lazy.Char8 as BL import qualified Data.CaseInsensitive as CI import Data.Default (Default, def) import Data.Monoid (mconcat) import qualified Data.Text.Lazy as T import Data.Text.Lazy.Encoding (encodeUtf8) import Network.HTTP.Types import Network.Wai import Web.Scotty.Types import Web.Scotty.Util -- Nothing indicates route failed (due to Next) and pattern matching should continue. -- Just indicates a successful response. runAction :: ActionEnv -> ActionM () -> IO (Maybe Response) runAction env action = do (e,r) <- flip MS.runStateT def $ flip runReaderT env $ runErrorT $ runAM $ action `catchError` defaultHandler return $ either (const Nothing) (const $ Just r) e defaultHandler :: ActionError -> ActionM () defaultHandler (Redirect url) = do status status302 header "Location" url defaultHandler (ActionError msg) = do status status500 html $ mconcat ["