我想定义标量类型,例如令牌
如果我以以下格式定义令牌,则编译失败
:scalars
{:Token }
根据https://lacinia.readthedocs.io/en/latest/custom-scalars.html,我需要提供parse和seririase函数
所以我在下面修改了代码,
:scalars
{:Token
{:parse #(str %)
:serialize #(str %)
}
}
现在,我收到了错误消息,因为“没有为((
如何将标量类型标记定义为“标量标记”?
答案 0 :(得分:1)
根据此PR::parse和:serialize不再是clojure.spec符合者。它们现在是简单的功能(版本0.37.0-alpha-1)
答案 1 :(得分:0)
就像nha在评论中说的那样,edn文件中不能包含函数文字。如果将其移至.clj文件,它将起作用。
但是,如果您确实希望将架构保留为.edn文件,则可以使用函数com.walmartlabs.lacinia.util/attach-scalar-transformers
。
schema.edn
:
{,,,
:scalars
{:Token {:parse :token-parser
:serialize :token-serializer}}}
schema.clj
(ns foo.schema
(:require
[??? :refer [slurp-edn]]
[com.walmartlabs.lacinia.schema :as schema]
[com.walmartlabs.lacinia.util :as util]))
(def transforms
{:token-parser #(,,,)
:token-serializer #(,,,)})
(defn schema []
(-> (slurp-edn "schema.edn")
(util/attach-scalar-transformers transforms)
;; ... attach resolvers, compile schema, etc
))
答案 2 :(得分:0)
感谢@madstap的回答,因为注释代码未正确突出显示。
在转换中,我发现它需要返回规范,以下代码有效
(def token-parser
(s/conformer
(fn [^String v]
(str v))))
(def token-serializer
(s/conformer
(fn [^String v]
(str v))))
(util/attach-scalar-transformers
{:token-parser token-parser
:token-serializer token-serializer
})