*问题:*
当尝试验证一个包含可选映射的向量时,如果向量包含有效的映射,规格则会正确验证。然而,如果可选映射不满足规格,则会产生误导性的错误消息。如果对可选映射的局部匹配能给出一些提示给用户会更好。
*用于说明问题的.REPL会话示例:*
以下可选嵌套映射 (:optional-nested-map) 验证失败,因为 :nested-element-b 是字符串而不是整数,然而解释报告说明规格在父谓词 :user/vector-schema 在 [:element-value] 位置失败: string?。
在这种情况下,如果规格报告指出在 :optional-nested-map 处可选嵌套映射由于 ::nested-element-b 在 int? 谓词验证失败而失败,那将更有助于用户。
{code:xml}
user=> (require '[clojure.spec :as s])
nil
user=> (s/def ::nested-element-a string?)
:user/nested-element-a
user=> (s/def ::nested-element-b int?)
:user/nested-element-b
user=> (s/def ::nested-element-schema
(s/keys :opt-un [::nested-element-a ::nested-element-b]))
:user/nested-element-schema
user=> (s/def ::vector-schema
(s/cat :tag-kw #{:tag}
:optional-nested-map (s/? (s/spec ::nested-element-schema))
:element-value string?))
:user/vector-schema
user=> (s/valid? ::vector-schema [:tag {:nested-element-a "bla" :nested-element-b 10} "Element"])
true
user=> (s/valid? ::vector-schema [:tag {:nested-element-a "bla" :nested-element-b ""} "Element"])
false
user=> (s/explain ::vector-schema [:tag {:nested-element-a "bla" :nested-element-b ""} "Element"])
In: [1] val: {:nested-element-a "bla", :nested-element-b ""} fails spec: :user/vector-schema at: [:element-value] predicate: string?
nil
user=>