diff --git a/doc/advanced/composing_routers.md b/doc/advanced/composing_routers.md index 4a0f37c9..87a14ea0 100644 --- a/doc/advanced/composing_routers.md +++ b/doc/advanced/composing_routers.md @@ -405,9 +405,53 @@ All the beer-routes now match in constant time. |-----------------|---------|----------------------- | `/beers/sahti` | 40ns | static +### Wrapping a swappable ring handler + +In order for a ring handler to be recomposed, we can wrap it into a handler that dereferences it on request. + +```clj +(defn deref-handler [rf] + (fn + ([request] (@rf request)) + ([request respond raise] (@rf request respond raise)))) +``` + +A simplified beer router version that creates a ring-handler. + +```clj +(defn create-ring-handler [beers] + (ring/ring-handler + (ring/router + [["/beers" + (when (seq beers) + (for [beer beers] + [(str "/" beer) + {:get (fn [_] {:status 200 :body beer})}]))]]))) + +(def ring-handler + (atom (create-ring-handler nil))) + +(defn reset-router! [beers] + (reset! ring-handler (create-ring-handler beers))) +``` + +We don't have any matching routes yet. + +```clj +((deref-handler ring-handler) {:request-method :get :uri "/beers/lager"}) +; nil +``` + +But we can add them later. + +```clj +(reset-router! ["lager"]) +((deref-handler ring-handler) {:request-method :get :uri "/beers/lager"}) +; {:status 200, :body "lager"} +``` + ## TODO -* add an example how to do dynamic routing with `reitit-ring` * maybe create a `recursive-router` into a separate ns with all `Router` functions implemented correctly? maybe not... * add `reitit.core/merge-routes` to effectively merge routes with route data