【发布时间】:2014-08-14 13:10:34
【问题描述】:
不久前,我询问了simple polymorphic schemas,那里的答案一度很好用。
现在我要验证的地图有一个附加值,它取决于另一个键的值。
对象的人为示例:
{: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,但我不能允许架构“松散”,因为意外的键/值应该被视为无效。
我也不想更改正在验证的地图的结构,只是为了允许使用此库进行验证。
是否有一种健全的方法来实现对具有多个条件子模式的映射的严格验证?
【问题讨论】: