Support composable transformations of mw/interceptor chain

* fixes #167
This commit is contained in:
Tommi Reiman 2018-11-18 22:19:30 +02:00
parent 18a9cdb802
commit ffc36fce36
5 changed files with 40 additions and 19 deletions

View file

@ -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:

View file

@ -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]

View file

@ -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))

View file

@ -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")))))))

View file

@ -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")))))))