Некоторое время назад я спросил о простых полиморфных схемах, и какое-то время ответ работал хорошо.
Теперь карта, которую я хочу проверить, имеет дополнительное значение, которое зависит от значения другого ключа.
Надуманный пример объекта:
{:type :foo {:type :bert {:type :foo
:foo-param :bar :bert-size :medium :foo-param :bar
:method :baz :method :baz :method :bang
:baz-rate :max} :baz-rate :max} :bangness :considerable}
Дискриминаторами здесь являются :type
и :method
, каждый из которых имеет собственный набор допустимых одноуровневых ключей и значений.
Раньше существовало только :type
, и работало следующее:
(def ^:private test-base-schema {:type (s/enum :foo :abc :banana)})
(def test-schema
(s/conditional #(= (:type %) :foo)
(merge test-base-schema {:foo-param s/Keyword})
; other conditions here
))
Однако теперь, когда имеется более одного дискриминатора, количество условных ветвей будет комбинаторным.
Один из вариантов — разрешить {s/Any s/Any}
на картах и использовать s/both
, но я не могу допустить, чтобы схемы были «свободными», так как неожиданные ключи/значения должны рассматриваться как недействительные.
Я также не хочу менять структуру проверяемой карты только для того, чтобы проверка работала с использованием этой библиотеки.
Есть ли разумный способ добиться строгой проверки карт, которые имеют несколько условных подсхем?