Hi there!
Have been really appreciating Bidi's data-driven approach to routing. I recently ran into something that surprised me, and I'm curious if I've gone astray.
Here's a rough sketch:
(require
'[bidi.bidi :as bidi]
'[bidi.ring :as bidi.ring])
(defmulti route1 ,,,)
(defmethod route1 ,,,)
(def routes
["/route1" route1])
(def handler
(bidi.ring/make-handler routes))
(handler {:uri "/route1" ,,,})
;; => Execution error (IllegalArgumentException) at bidi.bidi/eval7814$fn$G (bidi.cljc:183). No implementation of method: :resolve-handler of protocol: #'bidi.bidi/Matched found for class: clojure.lang.MultiFn
It's easy enough to implement the bidi.bidi/Matched and bidi.ring/Ring protocols for clojure.lang.MultiFn (identical to the Fn implementations):
(extend-protocol bidi/Matched
clojure.lang.MultiFn
(resolve-handler [this m] (bidi/succeed this m))
(unresolve-handler [this m] (when (= this (:handler m)) "")))
(extend-protocol bidi.ring/Ring
clojure.lang.MultiFn
(request [f req _] (f req)))
which seems to work as expected. But I'm curious whether this is the idiomatic way of doing this, or if MultiFn isn't supported for some other reason (e.g. CLJS, maintaining bidirectionality, etc., etc.). Mainly just looking for your guidance on the right way to go about doing this.
Thanks!
Hi there!
Have been really appreciating Bidi's data-driven approach to routing. I recently ran into something that surprised me, and I'm curious if I've gone astray.
Here's a rough sketch:
It's easy enough to implement the
bidi.bidi/Matchedandbidi.ring/Ringprotocols forclojure.lang.MultiFn(identical to theFnimplementations):which seems to work as expected. But I'm curious whether this is the idiomatic way of doing this, or if
MultiFnisn't supported for some other reason (e.g. CLJS, maintaining bidirectionality, etc., etc.). Mainly just looking for your guidance on the right way to go about doing this.Thanks!