从记录模式到Clojure中的映射模式

时间:2017-04-16 16:04:25

标签: clojure schema record

当我有一个模式定义如下的记录时:

(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)

1 个答案:

答案 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}