使用Clojure Spec和Datomic实体

时间:2016-10-11 06:44:31

标签: clojure datomic clojure.spec

说我有以下规格:

(s/def :person/age number?)
(s/def :person/name string?)

(s/def ::person (s/keys :req [:person/name :person/age]))

然后我从Datomic中获取一个实体:

(def person-entity (d/entity (d/db conn) [:person/name "Mr entity"]))

如果我尝试检查与规范的一致性,那么它失败了,因为实体不是地图:

(s/explain ::person person-entity)

val: #:db{:id 17592186069950} fails spec: :some-ns/person predicate: map?

我的应用程序具有将实体作为参数的功能,并且希望避免为了使规范工具在开发中工作而必须将实体统一到各处的地图。

我应该如何通过规范来验证实体?

1 个答案:

答案 0 :(得分:3)

虽然您的命名空间确实有点偏离(您应该使用:person / name而不是:: name),但是规范中的限制也可以解除。目前,s / keys要求所有输入集合都符合clojure.core/keys谓词。数据组实体不是映射,因此不要通过该检查(因此有关map?谓词的错误)。

我已经在此处提交了一份错误报告:http://dev.clojure.org/jira/browse/CLJ-2041如果您愿意,可以随意提供/关注该机票。