mirror of
https://github.com/metosin/reitit.git
synced 2025-12-17 08:21:11 +00:00
replace deep-merge with meta-merge
This commit is contained in:
parent
b4ceaf1318
commit
6eecc048be
3 changed files with 11 additions and 27 deletions
|
|
@ -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"]
|
||||||
|
|
|
||||||
|
|
@ -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)))))
|
|
||||||
|
|
|
||||||
|
|
@ -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))))))
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue