This commit is contained in:
Phillip Mates 2024-01-09 13:11:23 +01:00 committed by GitHub
commit 5099bbedd2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 10 deletions

View file

@ -143,6 +143,7 @@ We use [Break Versioning][breakver]. The version numbers follow a `<major>.<mino
```
* Improved Reitit-frontend function docstrings
* Allow multimethods to be interpreted as interceptors
* Updated deps:

View file

@ -28,6 +28,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
@ -60,12 +65,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