wai-routes 0.6.1 → 0.6.2
raw patch · 6 files changed
+43/−14 lines, 6 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Network.Wai.Middleware.Routes: maybeRoute :: HandlerM master (Maybe (Route master))
+ Network.Wai.Middleware.Routes: routeAttrSet :: RouteAttrs master => HandlerM master (Set Text)
+ Network.Wai.Middleware.Routes.Handler: maybeRoute :: HandlerM master (Maybe (Route master))
+ Network.Wai.Middleware.Routes.Handler: routeAttrSet :: RouteAttrs master => HandlerM master (Set Text)
+ Network.Wai.Middleware.Routes.Routes: currentRoute :: RequestData master -> Maybe (Route master)
- Network.Wai.Middleware.Routes: data RequestData
+ Network.Wai.Middleware.Routes: data RequestData master
- Network.Wai.Middleware.Routes: nextApp :: RequestData -> Application
+ Network.Wai.Middleware.Routes: nextApp :: RequestData master -> Application
- Network.Wai.Middleware.Routes: runNext :: RequestData -> ResponseHandler
+ Network.Wai.Middleware.Routes: runNext :: App master
- Network.Wai.Middleware.Routes: type Handler master = master -> RequestData -> ResponseHandler
+ Network.Wai.Middleware.Routes: type Handler master = master -> App master
- Network.Wai.Middleware.Routes: waiReq :: RequestData -> Request
+ Network.Wai.Middleware.Routes: waiReq :: RequestData master -> Request
- Network.Wai.Middleware.Routes.Routes: data RequestData
+ Network.Wai.Middleware.Routes.Routes: data RequestData master
- Network.Wai.Middleware.Routes.Routes: nextApp :: RequestData -> Application
+ Network.Wai.Middleware.Routes.Routes: nextApp :: RequestData master -> Application
- Network.Wai.Middleware.Routes.Routes: runNext :: RequestData -> ResponseHandler
+ Network.Wai.Middleware.Routes.Routes: runNext :: App master
- Network.Wai.Middleware.Routes.Routes: type Handler master = master -> RequestData -> ResponseHandler
+ Network.Wai.Middleware.Routes.Routes: type Handler master = master -> App master
- Network.Wai.Middleware.Routes.Routes: waiReq :: RequestData -> Request
+ Network.Wai.Middleware.Routes.Routes: waiReq :: RequestData master -> Request
Files
- README.md +3/−1
- examples/Example.hs +5/−1
- src/Network/Wai/Middleware/Routes.hs +2/−0
- src/Network/Wai/Middleware/Routes/Handler.hs +19/−3
- src/Network/Wai/Middleware/Routes/Routes.hs +11/−6
- wai-routes.cabal +3/−3
README.md view
@@ -1,4 +1,4 @@-Wai Routes (wai-routes-0.6.1)+Wai Routes (wai-routes-0.6.2) ==================================== [](https://travis-ci.org/ajnsit/wai-routes)@@ -8,6 +8,7 @@ Features: - Automatic generation of Route boilerplate using TH - Easy Nested Routes+ - General purpose Route Attributes/Annotations - Sitewide Master datatype which is passed to all handlers and can be used for persistent data (like DB connections) - RouteM monad that makes it easy to compose an application@@ -99,4 +100,5 @@ * 0.5.1 : Bumped dependency upper bounds to allow text 1.* * 0.6.0 : Removed dependency on yesod-routes. Updated code to compile with wai-3 and ghc-7.8, ghc-7.10 * 0.6.1 : Fixed cabal and travis files+* 0.6.2 : Added 'maybeRoute' and 'routeAttrSet', to get information about the currently executing route
examples/Example.hs view
@@ -33,7 +33,7 @@ -- Make MyRoute Routable mkRoute "MyRoute" [parseRoutes|-/ HomeR GET+/ HomeR !hello GET /users UsersR GET /user/#Int UserR: / UserRootR GET@@ -53,6 +53,10 @@ -- Display the possible actions getHomeR :: Handler MyRoute getHomeR = runHandlerM $ do+ mroute <- maybeRoute+ attrs <- routeAttrSet+ liftIO $ putStrLn $ show mroute+ liftIO $ putStrLn $ show attrs json $ M.fromList ( [("description", [["Simple User database Example"]]) ,("links"
src/Network/Wai/Middleware/Routes.hs view
@@ -52,6 +52,8 @@ , HandlerM() , runHandlerM -- | Run a HandlerM to get a Handler , request -- | Access the request data+ , maybeRoute -- | Access the current route+ , routeAttrSet -- | Access the current route attributes as a set , master -- | Access the master datatype , header -- | Add a header to the response , status -- | Set the response status
src/Network/Wai/Middleware/Routes/Handler.hs view
@@ -14,6 +14,8 @@ ( HandlerM() -- | A Monad that makes it easier to build a Handler , runHandlerM -- | Run a HandlerM to get a Handler , request -- | Access the request data+ , routeAttrSet -- | Access the route attribute list+ , maybeRoute -- | Access the route data , master -- | Access the master datatype , header -- | Add a header to the response , status -- | Set the response status@@ -25,15 +27,17 @@ ) where -import Network.Wai (Request, Response, responseBuilder)+import Network.Wai (Request, Response, responseBuilder, pathInfo, queryString) import Control.Monad (liftM) import Control.Monad.State (StateT, get, put, modify, runStateT, MonadState, MonadIO, lift, MonadTrans) import Control.Applicative (Applicative) -import Network.Wai.Middleware.Routes.Routes (RequestData, Handler, waiReq, runNext, ResponseHandler)+import Network.Wai.Middleware.Routes.Routes (RequestData, Handler, waiReq, currentRoute, runNext, ResponseHandler)+import Network.Wai.Middleware.Routes.Class (Route, RouteAttrs(..)) import Network.Wai.Middleware.Routes.ContentTypes (contentType, typeHtml, typeJson, typePlain) +import Data.Maybe (maybe) import Data.ByteString (ByteString) import qualified Data.ByteString.Lazy as BL import Network.HTTP.Types.Header (HeaderName())@@ -42,9 +46,13 @@ import Data.Aeson (ToJSON) import qualified Data.Aeson as A +import Data.Set (Set)+import qualified Data.Set as S (empty, map)+ import Data.Text.Lazy (Text) import qualified Data.Text.Lazy as T import Data.Text.Lazy.Encoding (encodeUtf8)+import Data.Text.Encoding (decodeUtf8) import Blaze.ByteString.Builder (fromLazyByteString) @@ -59,7 +67,7 @@ -- | The state kept in a HandlerM Monad data HandlerState master = HandlerState { getMaster :: master- , getRequestData :: RequestData+ , getRequestData :: RequestData master , respHeaders :: [(HeaderName, ByteString)] , respStatus :: Status , respBody :: BL.ByteString@@ -84,6 +92,14 @@ -- | Get the request request :: HandlerM master Request request = liftM (waiReq . getRequestData) get++-- | Get the current route+maybeRoute :: HandlerM master (Maybe (Route master))+maybeRoute = liftM (currentRoute . getRequestData) get++-- | Get the current route attributes+routeAttrSet :: RouteAttrs master => HandlerM master (Set Text)+routeAttrSet = liftM (S.map T.fromStrict . maybe S.empty routeAttrs . currentRoute . getRequestData) get -- | Add a header to the application response -- TODO: Differentiate between setting and adding headers
src/Network/Wai/Middleware/Routes/Routes.hs view
@@ -48,6 +48,7 @@ , RequestData -- | An abstract representation of the request data. You can get the wai request object by using `waiReq` , waiReq -- | Extract the wai `Request` object from `RequestData` , nextApp -- | Extract the next Application in the stack+ , currentRoute -- | Extract the current `Route` from `RequestData` , runNext -- | Run the next application in the stack )@@ -78,20 +79,23 @@ import Network.Wai.Middleware.Routes.ContentTypes -- An abstract request-data RequestData = RequestData+data RequestData master = RequestData { waiReq :: Request , nextApp :: Application+ , currentRoute :: Maybe (Route master) } -- AJ: Experimental type ResponseHandler = (Response -> IO ResponseReceived) -> IO ResponseReceived +type App master = RequestData master -> ResponseHandler+ -- | Run the next application in the stack-runNext :: RequestData -> ResponseHandler+runNext :: App master runNext req = nextApp req $ waiReq req -- | A `Handler` generates an App from the master datatype-type Handler master = master -> RequestData -> ResponseHandler+type Handler master = master -> App master -- Baked in applications that handle 404 and 405 errors -- TODO: Inspect the request to figure out acceptable output formats@@ -137,8 +141,8 @@ :: Handler master -> master -> Maybe (Route master)- -> RequestData -> ResponseHandler -- App-runHandler h master _ = h master+ -> App master+runHandler h master route reqdata = h master reqdata{currentRoute=route} -- | A `Routable` instance can be used in dispatching. -- An appropriate instance for your site datatype is@@ -148,7 +152,8 @@ -- | Generates the application middleware from a `Routable` master datatype routeDispatch :: Routable master => master -> Middleware-routeDispatch master def req = dispatcher master RequestData{waiReq=req, nextApp=def}+-- Route information is filled in by runHandler+routeDispatch master def req = dispatcher master RequestData{waiReq=req, nextApp=def, currentRoute=Nothing} -- | Renders a `Route` as Text showRoute :: RenderRoute master => Route master -> Text
wai-routes.cabal view
@@ -1,5 +1,5 @@ name : wai-routes-version : 0.6.1+version : 0.6.2 cabal-version : >=1.18 build-type : Simple license : MIT@@ -63,8 +63,8 @@ source-repository this type : git- location : http://github.com/ajnsit/wai-routes/tree/v0.6.1- tag : v0.6.1+ location : http://github.com/ajnsit/wai-routes/tree/v0.6.2+ tag : v0.6.2 library build-depends: base >= 4.7 && < 4.9