请在2024 Clojure状态调查中分享您的想法!

欢迎!请参阅关于页面,了解有关如何使用本网站的更多详细信息。

+1 投票
Spec

我在使用Spec 2时遇到的一个问题。

(s/def ::number      number?)
(s/def ::boolean     boolean?)
(s/def ::schema      (s/schema [::number ::boolean]))
(s/def ::only-number (s/select ::schema [::number]))
(s/def ::this-works  (s/keys :req [::only-number]))
(s/def ::this-fails  (s/schema [::only-number]))
Execution error (AssertionError) at clojure.alpha.spec.impl/schema-impl (impl.clj:422).
Assert failed: (every? (fn* [p1__6948#] (if-let [sp (s/get-spec p1__6948#)] (not (select? sp)) true)) ks)

我编写了这个示例来模拟我创建AWS DynamoDB REST API包装器时遇到的错误。

1 答案

+1 投票

不,这不受支持。s/union可以用来组合模式。

https://github.com/clojure/spec-alpha2/wiki/Schema-and-select


编辑
我对s/union的理解是,您可以使用它来组合两个处于同一层次结构的spec,例如(s/union ::user/private ::user/public)。

我想在这里的结构像这样的JSON结构
{"TransactItems":[{"Get":{"TableName":"string","Key":"string"}}]}

(s/def ::transact-schema (s/schema [::TableName ::Item ::Key ::ConditionExpression]))
(s/def ::Get                               (s/select ::transact-schema [::TableName ::Key]))
(s/def ::ConditionCheck  (s/select ::transact-schema [::TableName ::Key ::ConditionExpression]))
(s/def ::Put                                 (s/select ::transact-schema [::TableName ::Item]))

(s/def ::TransactGetItem   (s/schema [::Get]))
(s/def ::TransactWriteItem   (s/schema [::ConditionCheck ::Put]))
(s/def ::TransactItems
     (s/or :get                            (s/coll-of ::TransactGetItem :kind vector?)
               :write   (s/coll-of ::TransactWriteItem :kind vector?)))

我在这里指定了“Get”在内部层次上的可能值(包含“TableName”和“Key”作为键的映射)以及“TransactItems”在外部层次上可能值(包含“Get”作为键的映射数组或包含“Put”和“ConditionCheck”作为键的映射数组)。

来源: https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactGetItems.html
by
模式是一组键。联合将模式(组键)合并为更大的键集。它们没有嵌套或表示层次结构。

选择指定了嵌套映射结构所需的部分(基于顶层模式,如果顶层键引用一个模式,还可以遵守下层模式的规范)。

目前尚无方法在选择选择中提及映射集合的集合映射,尽管这是我们正在考虑的事情。我认为这正是你询问的问题空间。
by
明白了,谢谢。
...