{-# LANGUAGE OverloadedStrings #-} module Web.Scotty.Action ( addHeader , body , file , files , html , json , jsonData , next , param , params , raise , raw , readEither , redirect , reqHeader , request , rescue , setHeader , source , status , text , Param , Parsable(..) -- private to Scotty , runAction ) where import Blaze.ByteString.Builder (Builder, fromLazyByteString) 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.Conduit (Flush, ResourceT, Source) import Data.Default (def) import Data.Monoid (mconcat, (<>)) import qualified Data.Text.Lazy as T import Data.Text.Lazy.Encoding (encodeUtf8, decodeUtf8) 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 :: Monad m => ActionEnv -> ActionT m () -> m (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 :: Monad m => ActionError -> ActionT m () defaultHandler (Redirect url) = do status status302 setHeader "Location" url defaultHandler (ActionError msg) = do status status500 html $ mconcat ["