Как получить схему "хотя бы"?

По крайней мере, я имею в виду схему, которая будет игнорировать все disallowed-key ошибки. Рассмотрим следующий фрагмент:

(require '[schema.core :as s])

(def s {:a s/Int})

(s/check s {:a 1}) ;; => nil (check passed)
(s/check s {:a 1 :b 2}) ;; => {:b disallowed-key}

(def at-least-s (at-least s))

(s/check at-least-s {:a 1}) ;; => nil
(s/check at-least-s {:a 1 :b 2}) ;; => nil

Первая идея о реализации at-least функция должна была соединиться [s/Any s/Any] вход в исходную схему:

(defn at-least [s]
  (conj s [s/Any s/Any]))

но, к сожалению, такая реализация не будет работать для вложенных карт:

(def another-s {:a {:b s/Int}})

(s/check (at-least another-s) {:a {:b 1} :c 2}) ;; => nil
(s/check (at-least another-s) {:a {:b 1 :d 3} :c 2}) ;; => {:a {:d disallowed-key}}

Есть ли возможность получить at-least схемы, которые работают и для вложенных карт? Или, может быть prismatic/schema предоставляет что-то из коробки, что мне не хватает?

1 ответ

Решение

Есть кое-что, что вы можете использовать в https://github.com/metosin/schema-tools: schema-tools.walk, Существует даже код, который вам нужен в тесте:

(defn recursive-optional-keys [m]
  (sw/postwalk (fn [s]
                 (if (and (map? s) (not (record? s)))
                   (st/optional-keys s)
                   s))
               m))
Другие вопросы по тегам