Можно ли использовать Prismatic schema.core/ может быть в предварительном условии функции Clojure?
Я пытаюсь использовать Prismaticschema.core/maybe
в предварительном условии для функции, принимающей необязательный аргумент opts
, но, кажется, всегда бросать AssertionError
когда я вызываю функцию без opts
:
(require '[schema.core :as schema])
(defn foo [& modules]
{:pre [(schema/validate (schema/maybe [(schema/enum :foo :bar)]) opts)]}
:yay)
(foo :foo)
;=> :yay
(foo :foo :bar)
;=> :yay
(foo)
;=> AssertionError Assert failed: (schema/validate (schema/maybe [(schema/enum :foo :bar)]) modules) user/foo (form-init3808809389777994177.clj:1)
Интересно то, что это работает как ожидалось:
(schema/validate (schema/maybe [(schema/enum :foo :bar)]) nil)
;=> nil
Я использовал macroexpand
на defn
, но ничего необычного там не выглядит.
Я могу, конечно, обойти это с предварительным условием, как
1 ответ
Решение
Предварительное условие функции должно оцениваться как верное, чтобы утверждение прошло, но schema/validate
возвращает проверяемое выражение, если проверка прошла успешно, и выдает исключение, если оно не выполнено. Вам нужно будет изменить свое предварительное условие, чтобы оно всегда возвращало true, если проверка прошла успешно:
(defn foo [& opts]
{:pre [(or (schema/validate (schema/maybe [(schema/enum :foo :bar)]) opts) true)]}
:yay)
(foo :foo) ;=> :yay
(foo :foo :bar) ;=> :yay
(foo) ;=> :yay
(foo :baz) ;=> ExceptionInfo Value does not match schema: [(not (#{:foo :bar} :baz))]