Проверка полиморфной схемы в Clojure

Я хочу использовать схему для проверки объекта запроса. Одно из значений на карте определяет, какие другие поля действительны.

Например, все они будут действительны:

{ :name "jane" :type :dog :barking true }
{ :name "alan" :type :bird :cheeping true }
{ :name "bert" :type :fish :swimming true }

Некоторые поля являются общими. Но другие зависят от значения :type.

Например, это неверно:

{ :name "phil" :type :bird :barking false }

Как можно выразить такую ​​схему?

Я рад использовать либо схему clj-schema, либо призматическую схему.

Ответ 1

Вы можете использовать prismatic.schema conditional, чтобы выполнить это:

(s/conditional #(= (:type %) :bird) {:type (s/eq :bird) :chirping s/Bool}
               #(= (:type %) :fish) {:type (s/eq :fish) :swimming s/Bool}
               ...
               :default  {:type (s/eq :animal) :existing s/Bool})