不久前,我询问了关于简单多态模式的问题,那里的答案有一段时间效果很好。
现在我要验证的地图有一个附加值,它取决于另一个键的值。
一个人为的对象示例:
{: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
and :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
,但我不能允许模式“松散”,因为意外的键/值应该被视为无效。
我也不想更改正在验证的地图的结构,只是为了允许使用这个库进行验证。
有没有一种健全的方法来实现对具有多个条件子模式的映射的严格验证?