mirror of
https://github.com/metosin/reitit.git
synced 2025-12-16 16:01:11 +00:00
Support composable transformations of mw/interceptor chain
* fixes #167
This commit is contained in:
parent
18a9cdb802
commit
ffc36fce36
5 changed files with 40 additions and 19 deletions
|
|
@ -1,5 +1,9 @@
|
|||
## UNRELEASED
|
||||
|
||||
## `reitit-core`
|
||||
|
||||
* Added support for composing middleware & interceptor transformations, fixes [#167](https://github.com/metosin/reitit/issues/167).
|
||||
|
||||
## `reitit-spec`
|
||||
|
||||
* Spec problems are exposed as-is into request & response coercion errors, enabling pretty-printers like [expound](https://github.com/bhb/expound) to be used:
|
||||
|
|
|
|||
|
|
@ -110,11 +110,12 @@
|
|||
([interceptors data]
|
||||
(chain interceptors data nil))
|
||||
([interceptors data {:keys [::transform] :or {transform identity} :as opts}]
|
||||
(->> interceptors
|
||||
(keep #(into-interceptor % data opts))
|
||||
(transform)
|
||||
(keep #(into-interceptor % data opts))
|
||||
(into []))))
|
||||
(let [transform (if (vector? transform) (apply comp (reverse transform)) transform)]
|
||||
(->> interceptors
|
||||
(keep #(into-interceptor % data opts))
|
||||
(transform)
|
||||
(keep #(into-interceptor % data opts))
|
||||
(into [])))))
|
||||
|
||||
(defn compile-result
|
||||
([route opts]
|
||||
|
|
|
|||
|
|
@ -84,12 +84,13 @@
|
|||
|
||||
(defn- expand-and-transform
|
||||
[middleware data {:keys [::transform] :or {transform identity} :as opts}]
|
||||
(->> middleware
|
||||
(keep #(into-middleware % data opts))
|
||||
(into [])
|
||||
(transform)
|
||||
(keep #(into-middleware % data opts))
|
||||
(into [])))
|
||||
(let [transform (if (vector? transform) (apply comp (reverse transform)) transform)]
|
||||
(->> middleware
|
||||
(keep #(into-middleware % data opts))
|
||||
(into [])
|
||||
(transform)
|
||||
(keep #(into-middleware % data opts))
|
||||
(into []))))
|
||||
|
||||
(defn- compile-handler [middleware handler]
|
||||
((apply comp identity (keep :wrap middleware)) handler))
|
||||
|
|
|
|||
|
|
@ -222,19 +222,29 @@
|
|||
(enter ::kerran)
|
||||
(enter ::avaruus)]
|
||||
:handler handler}]
|
||||
options)))]
|
||||
options)))
|
||||
inject-debug (fn [interceptors]
|
||||
(concat
|
||||
(interleave (butlast interceptors) (repeat debug-i))
|
||||
[(last interceptors)]))
|
||||
sort-interceptors (fn [interceptors]
|
||||
(concat
|
||||
(sort-by :name (butlast interceptors))
|
||||
[(last interceptors)]))]
|
||||
|
||||
(testing "by default, all interceptors are applied in order"
|
||||
(let [app (create nil)]
|
||||
(is (= [::olipa ::kerran ::avaruus :ok] (app "/ping")))))
|
||||
|
||||
(testing "interceptors can be re-ordered"
|
||||
(let [app (create {::interceptor/transform (fn [interceptors]
|
||||
(concat
|
||||
(sort-by :name (butlast interceptors))
|
||||
[(last interceptors)]))})]
|
||||
(let [app (create {::interceptor/transform sort-interceptors})]
|
||||
(is (= [::avaruus ::kerran ::olipa :ok] (app "/ping")))))
|
||||
|
||||
(testing "adding debug interceptor between interceptors"
|
||||
(let [app (create {::interceptor/transform #(interleave % (repeat debug-i))})]
|
||||
(is (= [::olipa ::debug ::kerran ::debug ::avaruus ::debug :ok] (app "/ping")))))))
|
||||
(let [app (create {::interceptor/transform inject-debug})]
|
||||
(is (= [::olipa ::debug ::kerran ::debug ::avaruus ::debug :ok] (app "/ping")))))
|
||||
|
||||
(testing "vector of transformations"
|
||||
(let [app (create {::interceptor/transform [inject-debug
|
||||
sort-interceptors]})]
|
||||
(is (= [::avaruus ::debug ::debug ::debug ::kerran ::olipa :ok] (app "/ping")))))))
|
||||
|
|
|
|||
|
|
@ -254,4 +254,9 @@
|
|||
|
||||
(testing "adding debug middleware between middleware"
|
||||
(let [app (create {::middleware/transform #(interleave % (repeat debug-mw))})]
|
||||
(is (= [::olipa ::debug ::kerran ::debug ::avaruus ::debug :ok] (app "/ping")))))))
|
||||
(is (= [::olipa ::debug ::kerran ::debug ::avaruus ::debug :ok] (app "/ping")))))
|
||||
|
||||
(testing "vector of transformations"
|
||||
(let [app (create {::middleware/transform [#(interleave % (repeat debug-mw))
|
||||
(partial sort-by :name)]})]
|
||||
(is (= [::avaruus ::debug ::debug ::debug ::kerran ::olipa :ok] (app "/ping")))))))
|
||||
|
|
|
|||
Loading…
Reference in a new issue