gpt4 book ai didi

Clojure 规范 : how to validate either one or another map

转载 作者:行者123 更新时间:2023-12-02 17:18:22 25 4
gpt4 key购买 nike

我有这个 Clojure 代码来定义我的回复对象模式,可以是

{:message {:text "Hello"} :delay 3000}

{:action "typing_on":duration 5000}

reply 映射可以有 :message:action 以及分别可选的键 :delay:持续时间

我试图用 clojure.spec 来表达它:

(s/def ::action #{"typing_on" "typing_off" "mark_seen"})
(s/def ::duration int?)
(s/def ::delay int?)
(s/def ::message map?)

(s/def ::message-reply (s/keys :req-un [::message]
:opt-un [::delay]))

(s/def ::action-reply (s/keys :req-un [::action]
:opt-un [::duration]))

(s/def ::reply (or ::action-reply ::message-reply))

但是,这些规范将使用 true 验证它们在 or 子句中找到的第一个模式,在本例中为 ::action-reply。我试图实现的是 ::action-reply::message-reply::reply 的有效模式。

最佳答案

我猜你是想使用 s/or,而不是 or(这在这种情况下没有意义)?

(s/def ::reply (s/or :action-reply  ::action-reply
:message-reply ::message-reply))

也许对您的其中一个值尝试 s/conform 以了解如何使用符合的(‘spec-destructured’)值:

(s/conform ::reply {:message {:text "Hello"} :delay 3000})
; => [:message-reply {:message {:text "Hello"}, :delay 3000}]

关于Clojure 规范 : how to validate either one or another map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44954575/

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