metosin/malli

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

Open

#918 aberto em 9 de jul. de 2023

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

Métricas do repositório

Stars
 (1.724 stars)
Métricas de merge de PR
 (Nenhuma PRs mesclada em 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.

Guia do colaborador