【问题标题】:Polymorphic schema validation in ClojureClojure 中的多态模式验证
【发布时间】:2014-07-18 00:33:52
【问题描述】:

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

例如,这些都是有效的:

{ :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 模式。

【问题讨论】:

    标签: clojure 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})
    

    【讨论】:

    • 这看起来很棒,谢谢。通读测试代码似乎也是一个好主意。我有许多类型之间共有的字段(例如,我的示例中的 :name),因此希望避免在每个 cond 分支中重复这些字段。
    • 我用公共字段定义了一个基本类型,然后merge 它用包含专用字段的更具体的类型。棱柱模式只是地图,您可以通过所有常规方式操作它们。
    • 你是在每个条件下都做合并,还是可以在顶层做?
    猜你喜欢
    • 2016-09-12
    • 2011-02-20
    • 1970-01-01
    • 2013-09-24
    • 2010-11-02
    • 2019-07-31
    • 2021-12-09
    • 1970-01-01
    • 2023-02-03
    相关资源
    最近更新 更多