Clojure.spec "или" эквивалент "s / and" - PullRequest
0 голосов
/ 06 мая 2018

Мне понравилось работать с clojure.spec; это помогло раскрыть ошибки данных ближе к причине. В настоящее время я использую его для проверки ответа на запрос веб-сервера, но у меня возникают трудности с синтаксисом операции clojure.spec, которая допускает два разных ответа структуры карты.

В моих данных есть два возможных ответа на запрос веб-сервера:

{:assignment "1232123"} и

{:no-more-assignments true}

Я мог бы использовать multi-spec, но это кажется многословным для чего-то, что может быть так просто, как иметь одну спецификацию для каждого случая и определять спецификацию как:

(s/def ::response
  (s/or ::case-1 ::case-2))

Есть какой-то синтаксис, который я пропускаю, или мне нужно будет использовать multi-spec?

1 Ответ

0 голосов
/ 06 мая 2018

Вы можете использовать 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))
...