mirror of
https://github.com/metosin/reitit.git
synced 2025-12-22 02:21:11 +00:00
polish
This commit is contained in:
parent
6aa86cd055
commit
ef7a91697f
1 changed files with 13 additions and 12 deletions
|
|
@ -20,7 +20,7 @@ It's resolved routes and options:
|
|||
```clj
|
||||
(r/routes router)
|
||||
;[["/foo" {:name :user/foo}]
|
||||
; ["/bar/:idr" {:name :user/bar}]]
|
||||
; ["/bar/:id" {:name :user/bar}]]
|
||||
|
||||
(r/options router)
|
||||
;{:lookup #object[...]
|
||||
|
|
@ -133,9 +133,10 @@ As the `Match` contains the route data, we can create a new matching function th
|
|||
(defn recursive-match-by-path [router path]
|
||||
(if-let [match (r/match-by-path router path)]
|
||||
(if-let [subrouter (-> match :data :router)]
|
||||
(if-let [submatch (recursive-match-by-path subrouter (subs path (str/last-index-of (:template match) "/")))]
|
||||
(into [match] submatch))
|
||||
[match])))
|
||||
(let [subpath (subs path (str/last-index-of (:template match) "/"))]
|
||||
(if-let [submatch (recursive-match-by-path subrouter subpath)]
|
||||
(cons match submatch)))
|
||||
(list match))))
|
||||
```
|
||||
|
||||
With invalid nested path we get now `nil` as expected:
|
||||
|
|
@ -186,15 +187,15 @@ In all the examples above, the routers were created ahead of time, making the wh
|
|||
First, we need to modify our matching function to support router references:
|
||||
|
||||
```clj
|
||||
(defn- << [x]
|
||||
(if (instance? clojure.lang.IDeref x) (deref x) x))
|
||||
(defn- << [x] (if (instance? clojure.lang.IDeref x) (deref x) x))
|
||||
|
||||
(defn recursive-match-by-path [router path]
|
||||
(if-let [match (r/match-by-path (<< router) path)]
|
||||
(if-let [subrouter (-> match :data :router <<)]
|
||||
(if-let [submatch (recursive-match-by-path subrouter (subs path (str/last-index-of (:template match) "/")))]
|
||||
(into [match] submatch))
|
||||
[match])))
|
||||
(let [subpath (subs path (str/last-index-of (:template match) "/"))]
|
||||
(if-let [submatch (recursive-match-by-path subrouter subpath)]
|
||||
(cons match submatch)))
|
||||
(list match))))
|
||||
```
|
||||
|
||||
A router that can be updated on demand, for example based on a domain event when a new entry in inserted into a database. We'll wrap the router into a `atom` to achieve this.
|
||||
|
|
@ -213,7 +214,7 @@ Another router, which is re-created on each routing request.
|
|||
(reify clojure.lang.IDeref
|
||||
(deref [_]
|
||||
(r/router
|
||||
["/duo" (keyword (gensym ""))]))))
|
||||
["/duo" (keyword (gensym "duo"))]))))
|
||||
```
|
||||
|
||||
Now we can compose the routers into a system-level static root router.
|
||||
|
|
@ -276,10 +277,10 @@ The dynamic routes are re-created on every request:
|
|||
|
||||
```clj
|
||||
(name-path "/dynamic/duo")
|
||||
; [:other :2390883]
|
||||
; [:other :duo2390883]
|
||||
|
||||
(name-path "/dynamic/duo")
|
||||
; [:other :2390893]
|
||||
; [:other :duo2390893]
|
||||
```
|
||||
|
||||
### Performance
|
||||
|
|
|
|||
Loading…
Reference in a new issue