Lorsque nous bâtissons un API GraphQL en Clojure, nous utilisons la superbe lib de Walmart Labs Lacinia. Par contre, cette dernière exige que les field names exposés par le schema soient tous en camelCase.
Ce petit détail entre fortement en conflit avec les bonnes pratiques Clojurians qui sont d'avoir des vars en kebab-case.
Afin d'éviter de créer des maps mixed du genre:
{:id id-here
:internal-value my-internal-value
:longName nil
:veryLongName nil}on va fournir un field resolver à Lacinia en option de configuration lors du compile, comme ceci:
(ns platform.graphql.schema
(:require [camel-snake-kebab.core :refer :all]
[clojure.java.io :as io]
[clojure.edn :as edn]
[com.walmartlabs.lacinia.schema :as lacinia-schema]
[com.walmartlabs.lacinia.util :as lacinia-util]))
(defn- field-name->kebab-case [field-name]
(-> (->kebab-case field-name)
lacinia-schema/default-field-resolver))
(defn build-schema []
(-> (io/resource "graphql/schema.edn")
slurp
edn/read-string
(lacinia-util/attach-resolvers {:resolve-viewer queries/viewer})
(lacinia-schema/compile {:default-field-resolver field-name->kebab-case})))On indique donc à Lacinia que notre mapping de field name est en kebab-case all over the place!