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 * Improved Reitit-frontend function docstrings
* Allow multimethods to be interpreted as interceptors
* Updated deps: * Updated deps:

View file

@ -28,6 +28,11 @@
(def ^:dynamic *max-compile-depth* 10) (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 (extend-protocol IntoInterceptor
#?(:clj clojure.lang.Keyword #?(:clj clojure.lang.Keyword
@ -60,12 +65,12 @@
#?(:clj clojure.lang.Fn #?(:clj clojure.lang.Fn
:cljs function) :cljs function)
(into-interceptor [this data opts] (into-interceptor [this data opts]
(into-interceptor (into-interceptor (fn->interceptor-map this) data opts))
{:name ::handler
::handler this #?(:clj clojure.lang.MultiFn
:enter (fn [ctx] :cljs cljs.core.MultiFn)
(assoc ctx :response (this (:request ctx))))} (into-interceptor [this data opts]
data opts)) (into-interceptor (fn->interceptor-map this) data opts))
#?(:clj clojure.lang.PersistentArrayMap #?(:clj clojure.lang.PersistentArrayMap
:cljs cljs.core.PersistentArrayMap) :cljs cljs.core.PersistentArrayMap)

View file

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