我需要规范类似map-entry的向量,其键本身已规范化。每个向量看起来都像这样
[:my.spec-ed.key/foo 42]
具体使用的键各不相同,我希望能编写一个谓词,根据其键动态规范任何类似的map-entry向量,就像通过(s/keys)逐条规范映射的条目一样。
在这个例子中,假设键规范如下
(s/def :my.spec-ed.key/foo int?)
我能想到规范类似map-entry向量的最佳方法是这个
(s/def :my.spec-ed.key/pair (s/and vector? #(s/valid? (first %) (second %))))
这行得通,但我不喜欢它,因为(s/explain)在出错时并不那么好。例如,(s/explain :my.spec-ed.key/foo "foo")
是信息性的
"foo" - failed: int? spec: :my.spec-ed.key/foo
相反,(s/explain :my.spec-ed.key/pair [:my.spec-ed.key/foo "bar"])
并没有解释真正出错的真正原因(我传了一个字符串而不是整数),我不得不去查找原始规范来找出这个问题的答案
[:my.spec-ed.key/foo "bar"] - failed: (valid? (first %) (second %)) spec: :my.spec-ed.key/pair
有人有什么更好的方法来规范我的类似map-entry向量吗?顺便说一句,这些向量实际上不是来自映射,而且实际上也不会映射到映射,因此我无法使用专为映射设计的任何规范函数。