Clojure中的多态模式验证

时间:2014-05-28 16:50:05

标签: clojure schema

我想使用模式来验证请求对象。地图中的一个值确定哪些其他字段有效。

例如,这些都是有效的:

{ :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或Prismatic架构。

1 个答案:

答案 0 :(得分:14)

您可以使用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})