Skip to content

Implementation of protocols for MultiFn #204

@usernolan

Description

@usernolan

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!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions