fra*_*ank 1 clojure clojure.spec
我很喜欢和clojure.spec; 它有助于发现更接近原因的数据错误。目前,我正在使用它来验证对Web服务器请求的响应,但是我对clojure.spec操作的语法有困难,该语法允许两个不同的地图结构响应。
在我的数据中,Web服务器请求有两种可能的响应:
{:assignment "1232123"} 和
{:no-more-assignments true}
我可以使用multi-spec,但这似乎很冗长,因为对于每种情况只有一个规范并将该规范定义为:
(s/def ::response
(s/or ::case-1 ::case-2))
Run Code Online (Sandbox Code Playgroud)
是否有我需要忽略的语法或需要使用的语法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))
Run Code Online (Sandbox Code Playgroud)