fey*_*chu 1 clojure clojure.spec
我有这个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))
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,这些规范将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))
Run Code Online (Sandbox Code Playgroud)
也许试试s/conform你的一个值,看看如何使用conformed('spec-destructured')值:
(s/conform ::reply {:message {:text "Hello"} :delay 3000})
; => [:message-reply {:message {:text "Hello"}, :delay 3000}]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
378 次 |
| 最近记录: |