Clojure 使用棱柱模式验证多个多态值

Clojure 使用棱柱模式验证多个多态值,clojure,plumatic-schema,Clojure,Plumatic Schema,不久前,我问了一个问题,答案在一段时间内很有效 现在,我希望验证的映射有一个附加值,它取决于另一个键的值 该对象的人为示例: {:type :foo {:type :bert {:type :foo :foo-param :bar :bert-size :medium :foo-param :bar :method :baz :method :baz :m

不久前,我问了一个问题,答案在一段时间内很有效

现在,我希望验证的映射有一个附加值,它取决于另一个键的值

该对象的人为示例:

{: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
,但我不能允许模式“松散”,因为意外的键/值应视为无效

我也不想仅仅为了允许使用此库进行验证而更改正在验证的映射的结构


是否有一个明智的方法来实现对具有多个条件子模式的映射的严格验证?

< P>一个很有意思的答案是,这可能是一个数据模型不太理想的味道,你应该考虑重构它具有嵌套结构,如

{:type-info {:type :foo :foo-param :bar}
 :method-info {:method :baz :baz-rate :max}}
一个(也许)更有用的答案是,除了编写一个用于验证的自定义谓词之外,我认为使用开箱即用的模式集并不容易

如果这不可取,我想您需要引入一种新的模式类型。幸运的是,这在用户代码(或第三方库)中很容易做到。不幸的是,我看不到一种简单的方法来以清晰和正交的方式表示这两个概念(严格并集和条件映射结构)(不将它们组合到一个条件并集模式中,或者让并集具有条件感知)。我相信这是有办法的,但我一眼就看不出来