当我有一个模式定义如下的记录时:
(schema.core/defrecord Account [id :- schema/Uuid
short-id :- schema/Str
name :- schema/Str
created-at :- schema/Inst])
如何提取架构以应用于包含这些值的hashmap?
原因是HTTP服务接收映射并自动将模式应用于它们,如果我只使用Account,它会失败,因为映射不是Account类型。
我试图从解释中提取,如:
(schema.core/explain Account)
但我得到的并不是一个架构:
{:id Uuid,
:short-id Str,
:name Str,
:created-at Inst}
值是符号而不是类,因此,如果您尝试使用它:
(schema.core/validate (last (schema.core/explain server.models.account.Account)) {})
你收到这个错误:
IllegalArgumentException No implementation of method: :spec of protocol: #'schema.core/Schema found for class: clojure.lang.Symbol clojure.core/-cache-protocol-fn (core_deftype.clj:568)
答案 0 :(得分:0)
您可以使用内置的explain
功能:
(last (schema.core/explain Account))
{:id Uuid, :short-id Str, :name Str, :created-at Inst}
或者更棘手的spec
(-> (schema.core/spec Account)
:options
first
:schema
last
last)
{:id java.util.UUID, :short-id java.lang.String, :name java.lang.String, :created-at java.util.Date}