Merge pull request #590 from dgb23/patch-1

Update composing_routers.md
This commit is contained in:
Tommi Reiman 2023-03-09 08:40:53 +02:00 committed by GitHub
commit 2a789557f2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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