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!