module Network.Wai.Middleware.Routes.Monad
(
RouteM
, defaultAction
, middleware
, route
, toWaiApp
)
where
import Network.Wai
import Network.Wai.Middleware.Routes.Routes
import Network.HTTP.Types
import Control.Monad.State
data RouteState = RouteState
{ middlewares :: [Middleware]
, defaultApp :: Application
}
defaultApplication :: Application
defaultApplication _req = return $ responseLBS status404 [("Content-Type", "text/plain")] "Error : 404 - Document not found"
addMiddleware :: Middleware -> RouteState -> RouteState
addMiddleware m s@(RouteState {middlewares=ms}) = s {middlewares=m:ms}
setDefaultApp :: Application -> RouteState -> RouteState
setDefaultApp a s = s {defaultApp=a}
newtype RouteM a = S { runS :: StateT RouteState IO a }
deriving (Monad, MonadIO, Functor, MonadState RouteState)
middleware :: Middleware -> RouteM ()
middleware = modify . addMiddleware
route :: (Routable master) => master -> RouteM ()
route = middleware . routeDispatch
defaultAction :: Application -> RouteM ()
defaultAction = modify . setDefaultApp
initRouteState :: RouteState
initRouteState = RouteState [] defaultApplication
toWaiApp :: RouteM () -> IO Application
toWaiApp m = do
(_,s) <- runStateT (runS m) initRouteState
return $ foldl (\a b -> b a) (defaultApp s) (middlewares s)