metosin/malli

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

Open

#918 opened on Jul 9, 2023

View on GitHub
 (1 comment) (0 reactions) (0 assignees)Clojure (1,724 stars) (237 forks)batch import
enhancementhelp wanted

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