coerce & compile take opts, resolved in router

This commit is contained in:
Tommi Reiman 2017-08-14 08:04:20 +03:00
parent fa37e3e198
commit 93447fdc71
2 changed files with 18 additions and 18 deletions

View file

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

View file

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