评论由:jonesn 提供
嗨,
抱歉,创建之后我似乎无法编辑问题的描述。这里是一个简化的示例,希望可以帮助更好地展示情况。
当以下可选嵌套映射因:nested-element-b 不是字符串而是整数而失败验证时,说明报告说规范在父断言中失败::user/vector-schema 在:[:element-value] 断言:string?。
由于这是一个可选的映射,我明白这种情况。当没有找到匹配项时,它将移动到父级中的下一个断言。
话虽如此,我认为如果实现了部分匹配,将这个作为可能的规范失败点报告给用户会很有帮助(尤其是在大型可选嵌套数据结构中)。
{code:none}
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=>