Clojure.spec"或"相当于" s /和"

时间:2018-05-06 18:14:38

标签: 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))

是否有一些我忽略的语法,或者我需要使用multi-spec

1 个答案:

答案 0 :(得分:4)

您可以将orandkeys规范一起使用:

(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))