Clojure.spec "or" 相当于 "s/and"
Clojure.spec "or" equivalent of "s/and"
我很喜欢与 clojure.spec
一起工作;它有助于发现更接近原因的数据错误。目前我正在使用它来验证对 Web 服务器请求的响应,但我在使用 clojure.spec 操作的语法时遇到困难,该语法允许两种不同的映射结构响应。
在我的数据中,Web 服务器请求有两种可能的响应:
{:assignment "1232123"}
和
{:no-more-assignments true}
我可以使用 multi-spec
,但对于某些可能很简单的事情来说,这似乎很冗长,就像为每种情况制定一个规范并将规范定义为:
(s/def ::response
(s/or ::case-1 ::case-2))
是否有一些我忽略的语法或者我需要使用 multi-spec
?
您可以将 or
和 and
与 keys
规格一起使用:
(s/def ::assignment string?)
(s/def ::no-more-assignments boolean?)
(s/def ::response
(s/keys :req-un [(or ::assignment ::no-more-assignments)]))
(s/explain ::response {:assignment "123"})
;; Success!
(s/explain ::response {:foo true})
;; val: {:foo true} fails spec: :sandbox.so/response predicate: (or (contains? % :assignment) (contains? % :no-more-assignments))
我很喜欢与 clojure.spec
一起工作;它有助于发现更接近原因的数据错误。目前我正在使用它来验证对 Web 服务器请求的响应,但我在使用 clojure.spec 操作的语法时遇到困难,该语法允许两种不同的映射结构响应。
在我的数据中,Web 服务器请求有两种可能的响应:
{:assignment "1232123"}
和
{:no-more-assignments true}
我可以使用 multi-spec
,但对于某些可能很简单的事情来说,这似乎很冗长,就像为每种情况制定一个规范并将规范定义为:
(s/def ::response
(s/or ::case-1 ::case-2))
是否有一些我忽略的语法或者我需要使用 multi-spec
?
您可以将 or
和 and
与 keys
规格一起使用:
(s/def ::assignment string?)
(s/def ::no-more-assignments boolean?)
(s/def ::response
(s/keys :req-un [(or ::assignment ::no-more-assignments)]))
(s/explain ::response {:assignment "123"})
;; Success!
(s/explain ::response {:foo true})
;; val: {:foo true} fails spec: :sandbox.so/response predicate: (or (contains? % :assignment) (contains? % :no-more-assignments))