diff --git a/project.clj b/project.clj index 2c1133ca..26382202 100644 --- a/project.clj +++ b/project.clj @@ -11,6 +11,8 @@ :source-uri "https://github.com/metosin/reitit/{version}/{filepath}#L{line}" :metadata {:doc/format :markdown}} + :dependencies [[meta-merge "1.0.0"]] + :profiles {:dev {:plugins [[jonase/eastwood "0.2.3"] [lein-tach "0.3.0"] [lein-doo "0.1.7"] diff --git a/src/reitit/core.cljc b/src/reitit/core.cljc index 4387d38f..42c66c59 100644 --- a/src/reitit/core.cljc +++ b/src/reitit/core.cljc @@ -1,18 +1,5 @@ -(ns reitit.core) - -(defn- deep-merge [& values] - (let [[values strategy] (if (keyword? (first values)) - [(rest values) (first values)] - [values :replace])] - (cond - (every? map? values) - (apply merge-with (partial deep-merge strategy) values) - - (and (= strategy :into) (every? coll? values)) - (reduce into values) - - :else - (last values)))) +(ns reitit.core + (:require [meta-merge.core :refer [meta-merge]])) (defprotocol ExpandArgs (expand [this])) @@ -54,16 +41,11 @@ (defn map-meta [f routes] (mapv #(update % 1 f) routes)) -(defn merge-meta [key-strategy x] +(defn merge-meta [x] (reduce (fn [acc [k v]] - (let [strategy (or (key-strategy k) :replace)] - (deep-merge strategy acc {k v}))) - {} - x)) + (meta-merge acc {k v})) + {} x)) -(defn resolve-routes - ([x] - (resolve-routes (constantly :replace) x)) - ([key-strategy x] - (->> x (walk) (map-meta (partial merge-meta key-strategy))))) +(defn resolve-routes [x] + (->> x (walk) (map-meta merge-meta))) diff --git a/test/cljc/reitit/core_test.cljc b/test/cljc/reitit/core_test.cljc index 35bf79ad..f27fb7b9 100644 --- a/test/cljc/reitit/core_test.cljc +++ b/test/cljc/reitit/core_test.cljc @@ -20,11 +20,11 @@ ["/:sub-id" {:parameters {:sub-id String}}]] ["/pong"] ["/admin" {:mw [:admin] :roles #{:admin}} - ["/user" {:roles #{:user}}] + ["/user" {:roles ^:replace #{:user}}] ["/db" {:mw [:db]}]]] expected [["/api/ping" {:mw [:api], :handler :kikka}] ["/api/user/:id/:sub-id" {:mw [:api], :parameters {:id String, :sub-id String}}] ["/api/pong" {:mw [:api]}] ["/api/admin/user" {:mw [:api :admin], :roles #{:user}}] ["/api/admin/db" {:mw [:api :admin :db], :roles #{:admin}}]]] - (is (= expected (reitit/resolve-routes {:mw :into} routes)))))) + (is (= expected (reitit/resolve-routes routes))))))