gpt4 book ai didi

clojure - 使用 Prismatic Sc​​hema 验证多个多态值

转载 作者:行者123 更新时间:2023-12-01 10:47:19 25 4
gpt4 key购买 nike

不久前我问了关于 simple polymorphic schemas 的问题,并且那里的答案在一段时间内运作良好。

现在我希望验证的 map 有一个附加值,该值取决于另一个键的值。

对象的人为示例:

{: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
))

但是现在有多个鉴别器,条件分支的数量将是组合的。

一个选项是在 map 中允许 {s/Any s/Any} 并使用 s/both,但我不能允许模式“松散” ,因为意外的键/值应该被视为无效。

我也不想更改正在验证的 map 的结构,只是为了允许使用此库进行验证。

有没有一种合理的方法来实现对具有多个条件子模式的 map 的严格验证?

最佳答案

一个尖刻的回答是,这可能是你的数据模型不太理想的味道,你应该考虑重构它,使其具有像

这样的嵌套结构
{:type-info {:type :foo :foo-param :bar}
:method-info {:method :baz :baz-rate :max}}

一个(也许)更有帮助的答案是,我认为除了编写自定义谓词以进行验证之外,使用开箱即用的模式集并不容易。

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

关于clojure - 使用 Prismatic Sc​​hema 验证多个多态值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24383809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com