module Web.Scotty.Types where
import Control.Monad.Error
import Control.Monad.Reader
import Control.Monad.State
import Data.ByteString.Lazy.Char8 (ByteString)
import Data.Default (Default, def)
import Data.String (IsString(..))
import Data.Text.Lazy (Text, pack)
import Network.Wai
data ScottyState = ScottyState { middlewares :: [Middleware]
, routes :: [Middleware]
}
addMiddleware :: Middleware -> ScottyState -> ScottyState
addMiddleware m (ScottyState ms rs) = ScottyState (m:ms) rs
addRoute :: Middleware -> ScottyState -> ScottyState
addRoute r (ScottyState ms rs) = ScottyState ms (r:rs)
instance Default ScottyState where
def = ScottyState [] []
newtype ScottyM a = S { runS :: StateT ScottyState IO a }
deriving (Monad, MonadIO, Functor, MonadState ScottyState)
type Param = (Text, Text)
data ActionError = Redirect Text
| ActionError Text
| Next
deriving (Eq,Show)
instance Error ActionError where
strMsg = ActionError . pack
data ActionEnv = Env { getReq :: Request, getParams :: [Param], getBody :: ByteString }
newtype ActionM a = AM { runAM :: ErrorT ActionError (ReaderT ActionEnv (StateT Response IO)) a }
deriving ( Monad, MonadIO, Functor
, MonadReader ActionEnv, MonadState Response, MonadError ActionError)
data RoutePattern = Capture Text
| Literal Text
| Function (Request -> Maybe [Param])
instance IsString RoutePattern where fromString = Capture . pack