allow multimethods to be treated as interceptors

This commit is contained in:
Phillip Mates 2022-01-19 13:59:16 +01:00
parent 5973bc0f26
commit 067d4f982f
3 changed files with 21 additions and 10 deletions

View file

@ -17,6 +17,7 @@ We use [Break Versioning][breakver]. The version numbers follow a `<major>.<mino
**[compare](https://github.com/metosin/reitit/compare/0.5.15...master)**
* Improved Reitit-frontend function docstrings
* Allow multimethods to be interpreted as interceptors
## 0.5.15 (2021-08-05)

View file

@ -29,6 +29,11 @@
(def ^:dynamic *max-compile-depth* 10)
(defn- fn->interceptor-map [func]
{:name ::handler
::handler func
:enter (fn [ctx] (assoc ctx :response (func (:request ctx))))})
(extend-protocol IntoInterceptor
#?(:clj clojure.lang.Keyword
@ -61,12 +66,12 @@
#?(:clj clojure.lang.Fn
:cljs function)
(into-interceptor [this data opts]
(into-interceptor
{:name ::handler
::handler this
:enter (fn [ctx]
(assoc ctx :response (this (:request ctx))))}
data opts))
(into-interceptor (fn->interceptor-map this) data opts))
#?(:clj clojure.lang.MultiFn
:cljs cljs.core.MultiFn)
(into-interceptor [this data opts]
(into-interceptor (fn->interceptor-map this) data opts))
#?(:clj clojure.lang.PersistentArrayMap
:cljs cljs.core.PersistentArrayMap)

View file

@ -31,6 +31,11 @@
(defn handler [request]
(conj request :ok))
(defmulti multimethod-handler (fn [request] (get request :type)))
(defmethod multimethod-handler :default [request]
(conj request :multi-ok))
(defn create
([interceptors]
(create interceptors nil))
@ -210,11 +215,11 @@
i5 {:compile (fn [{:keys [mount?]} _]
(when mount?
(interceptor ::i5)))}
chain1 (interceptor/chain [i1 i2 i3 i4 i5 handler] {:mount? true})
chain2 (interceptor/chain [i1 i2 i3 i4 i5 handler] {:mount? false})
chain1 (interceptor/chain [i1 i2 i3 i4 i5 handler multimethod-handler] {:mount? true})
chain2 (interceptor/chain [i1 i2 i3 i4 i5 handler multimethod-handler] {:mount? false})
chain3 (interceptor/chain [i1 i2 i3 i4 i5] {:mount? false})]
(is (= [::enter_i1 ::enter_i3 ::enter_i4 ::enter_i5 :ok ::leave_i5 ::leave_i4 ::leave_i3 ::leave_i1] (execute chain1 ctx)))
(is (= [::enter_i1 ::enter_i3 ::enter_i4 :ok ::leave_i4 ::leave_i3 ::leave_i1] (execute chain2 ctx)))
(is (= [::enter_i1 ::enter_i3 ::enter_i4 ::enter_i5 :ok :multi-ok ::leave_i5 ::leave_i4 ::leave_i3 ::leave_i1] (execute chain1 ctx)))
(is (= [::enter_i1 ::enter_i3 ::enter_i4 :ok :multi-ok ::leave_i4 ::leave_i3 ::leave_i1] (execute chain2 ctx)))
(is (= [::leave_i4 ::leave_i3 ::leave_i1] (execute chain3 ctx))))))
(deftest interceptor-transform-test