1
我有这样的Clojure代码来定义我的架构答复的对象,它可以是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
的有效模式。
我仍然不清楚为什么我需要在S按键/或条款,但这似乎正确地描述了我想要的。 – feychou
@feychou“s/or”子句中的键允许您查看数据符合时采用哪个分支,或发生错误 – Josh