【问题标题】:From record schema to map schema in ClojureClojure 中从记录模式到映射模式
【发布时间】:2017-04-24 21:03:40
【问题描述】:

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

(schema.core/defrecord Account [id :- schema/Uuid
                                short-id :- schema/Str
                                name :- schema/Str
                                created-at :- schema/Inst])

如何提取架构以应用于包含这些值的哈希映射?

原因是 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)

【问题讨论】:

  • 您在问如何从记录定义中提取此架构,或者如何为地图构造等效架构?
  • @fl00r 如何从记录中提取它,这样我就不必手动重新创建它。我会修改问题。

标签: clojure schema record


【解决方案1】:

您可以使用内置的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}

【讨论】:

  • 第一个不是有效的架构。 str有一个符号而不是schema.core/Str,就是一个类。
  • 从规范中获取的解决方案似乎可行,但确实很复杂。
猜你喜欢
  • 2011-07-11
  • 2017-12-18
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
  • 2017-07-15
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多