metosin/malli

`:multi` schema throws cryptic error when a string is used as a dispatch key

Open

#918 opened on Jul 9, 2023

 (1 comment) (0 reactions) (0 assignees)Clojure (237 forks)batch import
enhancementhelp wanted

Repository metrics

Stars
 (1,724 stars)
PR merge metrics
 (No merged PRs in 30d)

Description

I'm trying to write multi schema to validate a map with strings as a key:

  (def valid?
    (m/validator
     [:multi {:dispatch "type"}
      ["object" [:map-of :keyword :string]]
      [::m/default :string]]))

Here is an exception thrown:

1. Caused by clojure.lang.ExceptionInfo
   :malli.core/sci-not-available
   {:type :malli.core/sci-not-available,
    :message :malli.core/sci-not-available,
    :data {:code "type"}}
                 core.cljc:  138  malli.core$_exception/invokeStatic
                 core.cljc:  136  malli.core$_exception/invoke
                 core.cljc:  142  malli.core$_fail_BANG_/invokeStatic
                 core.cljc:  140  malli.core$_fail_BANG_/invoke
                 core.cljc: 2346  malli.core$eval13299$_fail_BANG___13300/invoke
                 core.cljc: 2355  malli.core$eval13299$eval__13306/invoke
                 core.cljc: 1544  malli.core$_multi_schema$reify__12949/_into_schema
                 core.cljc: 1992  malli.core$into_schema/invokeStatic
                 core.cljc: 1983  malli.core$into_schema/invoke
                 core.cljc: 2052  malli.core$schema/invokeStatic
                 core.cljc: 2034  malli.core$schema/invoke
                 core.cljc: 2116  malli.core$validator/invokeStatic
                 core.cljc: 2110  malli.core$validator/invoke
                 core.cljc: 2114  malli.core$validator/invokeStatic
                 core.cljc: 2110  malli.core$validator/invoke
,,,

It looks like a string interpreted as an SCI expression, which is a bit surprising.

How about adding :dispatch-key property for :multi schema? This prop could be mutually exclusive with :dispatch but when present will be treated as a literal key to dispatch by. This allows to dispatch by any key, including string, var, object etc.

Contributor guide