Clojure:如何在edn格式的Lacinia Graphql模式中添加标量类型?

时间:2018-12-18 05:21:29

标签: clojure graphql

我想定义标量类型,例如令牌

如果我以以下格式定义令牌,则编译失败

:scalars
  {:Token }

根据https://lacinia.readthedocs.io/en/latest/custom-scalars.html,我需要提供parse和seririase函数

所以我在下面修改了代码,

 :scalars
   {:Token 
     {:parse #(str %)
      :serialize #(str %)
     }
   }

现在,我收到了错误消息,因为“没有为((

如何将标量类型标记定义为“标量标记”?

3 个答案:

答案 0 :(得分:1)

根据此PR::parse和:serialize不再是clojure.spec符合者。它们现在是简单的功能(版本0.37.0-alpha-1)

https://github.com/walmartlabs/lacinia/pull/246/files/204030750a8f5c77a460147d8a376a4039d4ff0e#diff-8b1c3fd0d4a6765c16dfd18509182f9dR22

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