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的理解是,您可以使用它与相同的层次结构的两个规范结合,如(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     事务项
                :get       (s/coll-of ::TransactGetItem :kind vector?))
                :write (s/coll-of ::TransactWriteItem :kind vector?)))

在这里,我指定了内部层级“获取”的值(包含“TableName”和“Key”作为键的映射)和外部层级“事务项”的值(包含“获取”作为键的映射数组,或者包含“插入”和“条件检查”作为键的映射数组)。

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

选择指定了嵌套映射结构所需的部件(根据顶层模式,但也根据较低层级的模式,如果顶层键引用一个模式)。

在当前的选择选择中无法讨论映射集合的映射,尽管这是我们将考虑的事情。我认为这就是你询问的问题空间。
by
明白了,谢谢。
...