Как получить схему "хотя бы"?
По крайней мере, я имею в виду схему, которая будет игнорировать все 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))