Quiero definir el tipo escalar como Token

Si defino Token en el siguiente formato, no se compila

:scalars
  {:Token }

De acuerdo con https://lacinia.readthedocs.io/en/latest/custom- scalars.html, necesito dar funciones de análisis y seririasa

Así que he modificado el código a continuación,

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

Ahora recibo un error como "Sin macro de despacho para: ("

¿Cómo puedo definir el token de tipo escalar como "token escalar"?

1
anish 18 dic. 2018 a las 08:21

3 respuestas

La mejor respuesta

Como dice nha en los comentarios, no puede tener literales de función en archivos edn. Si mueve esto a un archivo .clj, funcionará.

Sin embargo, si desea mantener el esquema como un archivo .edn, existe la función com.walmartlabs.lacinia.util/attach-scalar-transformers para eso.

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
      ))
1
madstap 18 dic. 2018 a las 17:06

Gracias @madstap por la respuesta, en el código de comentario no se resalta correctamente.

En las transformaciones descubrí que necesita devolver las especificaciones, el siguiente código funcionó

(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
         })
1
anish 19 dic. 2018 a las 00:17

Según este PR: parse y: serialize ya no son conformadores clojure.spec. Son funciones simples ahora (versión 0.37.0-alpha-1)

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

1
Jing Wang 25 may. 2020 a las 20:45