mirror of
https://github.com/metosin/reitit.git
synced 2026-02-08 04:43:12 +00:00
coerce & compile take opts, resolved in router
This commit is contained in:
parent
fa37e3e198
commit
93447fdc71
2 changed files with 18 additions and 18 deletions
|
|
@ -58,11 +58,11 @@
|
||||||
(defn resolve-routes [data {:keys [coerce] :as opts}]
|
(defn resolve-routes [data {:keys [coerce] :as opts}]
|
||||||
(cond-> (->> (walk data opts)
|
(cond-> (->> (walk data opts)
|
||||||
(map-meta merge-meta))
|
(map-meta merge-meta))
|
||||||
coerce (->> (mapv (partial coerce))
|
coerce (->> (mapv #(coerce % opts))
|
||||||
(filterv identity))))
|
(filterv identity))))
|
||||||
|
|
||||||
(defn compile-route [compile [p m :as route]]
|
(defn compile-route [[p m :as route] {:keys [compile] :as opts}]
|
||||||
[p m (if compile (compile route))])
|
[p m (if compile (compile route opts))])
|
||||||
|
|
||||||
(defprotocol Routing
|
(defprotocol Routing
|
||||||
(routes [this])
|
(routes [this])
|
||||||
|
|
@ -72,8 +72,9 @@
|
||||||
(defrecord Match [template meta path handler params])
|
(defrecord Match [template meta path handler params])
|
||||||
|
|
||||||
(def default-router-options
|
(def default-router-options
|
||||||
{:coerce identity
|
{:expand expand
|
||||||
:compile (comp :handler second)})
|
:coerce (fn [route _] route)
|
||||||
|
:compile (fn [[_ {:keys [handler]}] _] handler)})
|
||||||
|
|
||||||
(defrecord LinearRouter [routes data lookup]
|
(defrecord LinearRouter [routes data lookup]
|
||||||
Routing
|
Routing
|
||||||
|
|
@ -91,13 +92,12 @@
|
||||||
((lookup name) params)))
|
((lookup name) params)))
|
||||||
|
|
||||||
(defn linear-router
|
(defn linear-router
|
||||||
"Creates a [[LinearRouter]] from routes and optional options.
|
"Creates a [[LinearRouter]] from resolved routes and optional
|
||||||
See [[router]] for available options"
|
expanded options. See [[router]] for available options"
|
||||||
([routes]
|
([routes]
|
||||||
(linear-router routes {}))
|
(linear-router routes {}))
|
||||||
([routes opts]
|
([routes opts]
|
||||||
(let [{:keys [compile]} (meta-merge default-router-options opts)
|
(let [compiled (map #(compile-route % opts) routes)
|
||||||
compiled (map (partial compile-route compile) routes)
|
|
||||||
[data lookup] (reduce
|
[data lookup] (reduce
|
||||||
(fn [[data lookup] [p {:keys [name] :as meta} handler]]
|
(fn [[data lookup] [p {:keys [name] :as meta} handler]]
|
||||||
(let [route (impl/create [p meta handler])]
|
(let [route (impl/create [p meta handler])]
|
||||||
|
|
@ -119,8 +119,8 @@
|
||||||
((lookup name) params)))
|
((lookup name) params)))
|
||||||
|
|
||||||
(defn lookup-router
|
(defn lookup-router
|
||||||
"Creates a [[LookupRouter]] from routes and optional options.
|
"Creates a [[LookupRouter]] from resolved routes and optional
|
||||||
See [[router]] for available options"
|
expanded options. See [[router]] for available options"
|
||||||
([routes]
|
([routes]
|
||||||
(lookup-router routes {}))
|
(lookup-router routes {}))
|
||||||
([routes opts]
|
([routes opts]
|
||||||
|
|
@ -130,8 +130,7 @@
|
||||||
(str "can't create LookupRouter with wildcard routes: " route)
|
(str "can't create LookupRouter with wildcard routes: " route)
|
||||||
{:route route
|
{:route route
|
||||||
:routes routes})))
|
:routes routes})))
|
||||||
(let [{:keys [compile]} (meta-merge default-router-options opts)
|
(let [compiled (map #(compile-route % opts) routes)
|
||||||
compiled (map (partial compile-route compile) routes)
|
|
||||||
[data lookup] (reduce
|
[data lookup] (reduce
|
||||||
(fn [[data lookup] [p {:keys [name] :as meta} handler]]
|
(fn [[data lookup] [p {:keys [name] :as meta} handler]]
|
||||||
[(assoc data p (->Match p meta p handler {}))
|
[(assoc data p (->Match p meta p handler {}))
|
||||||
|
|
@ -151,11 +150,12 @@
|
||||||
| `:routes` | Initial resolved routes (default `[]`)
|
| `:routes` | Initial resolved routes (default `[]`)
|
||||||
| `:meta` | Initial expanded route-meta vector (default `[]`)
|
| `:meta` | Initial expanded route-meta vector (default `[]`)
|
||||||
| `:expand` | Function `arg => meta` to expand route arg to route meta-data (default `reitit.core/expand`)
|
| `:expand` | Function `arg => meta` to expand route arg to route meta-data (default `reitit.core/expand`)
|
||||||
| `:coerce` | Function `[path meta] => [path meta]` to coerce resolved route, can throw or return `nil` (default `identity`)
|
| `:coerce` | Function `[path meta] opts => [path meta]` to coerce resolved route, can throw or return `nil`
|
||||||
| `:compile` | Function `[path meta] => handler` to compile a route handler (default `(comp :handler second)`)"
|
| `:compile` | Function `[path meta] opts => handler` to compile a route handler"
|
||||||
([data]
|
([data]
|
||||||
(router data {}))
|
(router data {}))
|
||||||
([data opts]
|
([data opts]
|
||||||
(let [routes (resolve-routes data opts)]
|
(let [opts (meta-merge default-router-options opts)
|
||||||
|
routes (resolve-routes data opts)]
|
||||||
((if (some impl/contains-wilds? (map first routes))
|
((if (some impl/contains-wilds? (map first routes))
|
||||||
linear-router lookup-router) routes opts))))
|
linear-router lookup-router) routes opts))))
|
||||||
|
|
|
||||||
|
|
@ -58,10 +58,10 @@
|
||||||
(testing "route coercion & compilation"
|
(testing "route coercion & compilation"
|
||||||
(testing "custom compile"
|
(testing "custom compile"
|
||||||
(let [compile-times (atom 0)
|
(let [compile-times (atom 0)
|
||||||
coerce (fn [[path meta]]
|
coerce (fn [[path meta] _]
|
||||||
(if-not (:invalid? meta)
|
(if-not (:invalid? meta)
|
||||||
[path (assoc meta :path path)]))
|
[path (assoc meta :path path)]))
|
||||||
compile (fn [[path meta]]
|
compile (fn [[path meta] _]
|
||||||
(swap! compile-times inc)
|
(swap! compile-times inc)
|
||||||
(constantly path))
|
(constantly path))
|
||||||
router (reitit/router
|
router (reitit/router
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue