Проверка полиморфной схемы в 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-схему, либо призматическую схему.
1 ответ
Решение
Вы можете использовать prismatic.schema's 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})