спецификация clojure, ключевое слово должно быть ноль - PullRequest
0 голосов
/ 17 мая 2018

У меня простая проблема.
Учитывая спецификацию, я хочу использовать ту же спецификацию, но только как нильский вариант.

Е.Г.

(s/def ::uuid uuid?)
(s/def ::problem-spec (s/keys :req-un [::uuid]))
(s/def ::nilable-problem-spec (s/keys :req-un [::uuid])) ; <- (or nil ::uuid)

; what I expect
(s/valid? ::uuid #uuid "9494a3e0-7ef0-4b3f-b539-bd7f7f4f0181") ; true
(s/valid? ::uuid nil) ; false
(s/valid? ::problem-spec {:uuid #uuid "9494a3e0-7ef0-4b3f-b539-bd7f7f4f0181"}) ; true
(s/valid? ::problem-spec {:uuid nil}) ; false
(s/valid? ::nilable-problem-spec {:uuid #uuid "9494a3e0-7ef0-4b3f-b539-bd7f7f4f0181"}) ; true
(s/valid? ::nilable-problem-spec {:uuid nil}) ; true

1 Ответ

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

Поскольку вы определили ::uuid как ненулевое значение, вы не можете использовать клавишу ::uuid для нулевого значения в карте / наборе ключей.Это намеренно - квалифицированные ключи в спецификации определены глобально.

В этом случае вы можете указать спецификацию ::uuid как nillable, а затем ограничить ненулевую версию набора ключей:

(s/def ::uuid (s/nilable uuid?))

(s/def ::problem-spec (s/and (s/keys :req-un [::uuid])
                             #(some? (:uuid %))))

(s/def ::nilable-problem-spec (s/keys :req-un [::uuid])) ;; as previously

В качестве альтернативы, поскольку вы имеете дело с неквалифицированными ключами на картах, вы также можете определить два разных квалифицированных ключа uuid с различной семантикой:

(s/def :nillable/uuid (s/nilable uuid?))
(s/def :non.nil/uuid uuid?)

(s/def ::problem-spec (s/keys :req-un [:non.nil/uuid])))
(s/def ::nilable-problem-spec (s/keys :req-un [:nillable/uuid]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...