mirror of
https://github.com/metosin/reitit.git
synced 2025-12-28 04:18:24 +00:00
commit
2a789557f2
1 changed files with 45 additions and 1 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue