replace deep-merge with meta-merge

This commit is contained in:
Tommi Reiman 2017-08-07 15:18:38 +03:00
parent b4ceaf1318
commit 6eecc048be
3 changed files with 11 additions and 27 deletions

View file

@ -11,6 +11,8 @@
:source-uri "https://github.com/metosin/reitit/{version}/{filepath}#L{line}" :source-uri "https://github.com/metosin/reitit/{version}/{filepath}#L{line}"
:metadata {:doc/format :markdown}} :metadata {:doc/format :markdown}}
:dependencies [[meta-merge "1.0.0"]]
:profiles {:dev {:plugins [[jonase/eastwood "0.2.3"] :profiles {:dev {:plugins [[jonase/eastwood "0.2.3"]
[lein-tach "0.3.0"] [lein-tach "0.3.0"]
[lein-doo "0.1.7"] [lein-doo "0.1.7"]

View file

@ -1,18 +1,5 @@
(ns reitit.core) (ns reitit.core
(:require [meta-merge.core :refer [meta-merge]]))
(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))))
(defprotocol ExpandArgs (defprotocol ExpandArgs
(expand [this])) (expand [this]))
@ -54,16 +41,11 @@
(defn map-meta [f routes] (defn map-meta [f routes]
(mapv #(update % 1 f) routes)) (mapv #(update % 1 f) routes))
(defn merge-meta [key-strategy x] (defn merge-meta [x]
(reduce (reduce
(fn [acc [k v]] (fn [acc [k v]]
(let [strategy (or (key-strategy k) :replace)] (meta-merge acc {k v}))
(deep-merge strategy acc {k v}))) {} x))
{}
x))
(defn resolve-routes (defn resolve-routes [x]
([x] (->> x (walk) (map-meta merge-meta)))
(resolve-routes (constantly :replace) x))
([key-strategy x]
(->> x (walk) (map-meta (partial merge-meta key-strategy)))))

View file

@ -20,11 +20,11 @@
["/:sub-id" {:parameters {:sub-id String}}]] ["/:sub-id" {:parameters {:sub-id String}}]]
["/pong"] ["/pong"]
["/admin" {:mw [:admin] :roles #{:admin}} ["/admin" {:mw [:admin] :roles #{:admin}}
["/user" {:roles #{:user}}] ["/user" {:roles ^:replace #{:user}}]
["/db" {:mw [:db]}]]] ["/db" {:mw [:db]}]]]
expected [["/api/ping" {:mw [:api], :handler :kikka}] expected [["/api/ping" {:mw [:api], :handler :kikka}]
["/api/user/:id/:sub-id" {:mw [:api], :parameters {:id String, :sub-id String}}] ["/api/user/:id/:sub-id" {:mw [:api], :parameters {:id String, :sub-id String}}]
["/api/pong" {:mw [:api]}] ["/api/pong" {:mw [:api]}]
["/api/admin/user" {:mw [:api :admin], :roles #{:user}}] ["/api/admin/user" {:mw [:api :admin], :roles #{:user}}]
["/api/admin/db" {:mw [:api :admin :db], :roles #{:admin}}]]] ["/api/admin/db" {:mw [:api :admin :db], :roles #{:admin}}]]]
(is (= expected (reitit/resolve-routes {:mw :into} routes)))))) (is (= expected (reitit/resolve-routes routes))))))