Single pass router creation

This commit is contained in:
Tommi Reiman 2017-08-13 14:53:50 +03:00
parent 0a58510dc2
commit 91bc72e8cd

View file

@ -97,16 +97,15 @@
(linear-router routes {})) (linear-router routes {}))
([routes opts] ([routes opts]
(let [{:keys [compile]} (meta-merge default-router-options opts) (let [{:keys [compile]} (meta-merge default-router-options opts)
compiled (map (partial compile-route compile) routes)] compiled (map (partial compile-route compile) routes)
(->LinearRouter [data lookup] (reduce
routes (fn [[data lookup] [p {:keys [name] :as meta} handler]]
(mapv (partial impl/create) compiled) (let [route (impl/create [p meta handler])]
(->> (for [[p {:keys [name] :as meta} handler] compiled [(conj data route)
:when name (if name
:let [route (impl/create [p meta handler])]] (assoc lookup name #(->Match p meta (impl/path-for route %) handler %))
[name (fn [params] lookup)])) [[] {}] compiled)]
(->Match p meta (impl/path-for route params) handler params))]) (->LinearRouter routes data lookup))))
(into {}))))))
(defrecord LookupRouter [routes data lookup] (defrecord LookupRouter [routes data lookup]
Routing Routing
@ -125,24 +124,21 @@
([routes] ([routes]
(lookup-router routes {})) (lookup-router routes {}))
([routes opts] ([routes opts]
(when-let [route (some impl/contains-wilds? (map first routes))]
(throw
(ex-info
(str "can't create LookupRouter with wildcard routes: " route)
{:route route
:routes routes})))
(let [{:keys [compile]} (meta-merge default-router-options opts) (let [{:keys [compile]} (meta-merge default-router-options opts)
compiled (map (partial compile-route compile) routes)] compiled (map (partial compile-route compile) routes)
(when-let [route (some impl/contains-wilds? (map first routes))] [data lookup] (reduce
(throw (fn [[data lookup] [p {:keys [name] :as meta} handler]]
(ex-info [(assoc data p (->Match p meta p handler {}))
(str "can't create LookupRouter with wildcard routes: " route) (if name
{:route route (assoc lookup name #(->Match p meta p handler %))
:routes routes}))) lookup)]) [{} {}] compiled)]
(->LookupRouter (->LookupRouter routes data lookup))))
routes
(->> (for [[p meta handler] compiled]
[p (->Match p meta p handler {})])
(into {}))
(->> (for [[p {:keys [name] :as meta} handler] compiled
:when name]
[name (fn [params]
(->Match p meta p handler params))])
(into {}))))))
(defn router (defn router
"Create a [[Router]] from raw route data and optionally an options map. "Create a [[Router]] from raw route data and optionally an options map.