Можно ли использовать 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))]
Другие вопросы по тегам