我有这个 Clojure 代码来为回复对象定义我的模式,它可以是
{:message {:text "Hello"} :delay 3000}
或者
{:action "typing_on" :duration 5000}
reply
地图可以有:message
或:action
和 分别可选的键:delay
和:duration
。
我试图用这种方式表达它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