OverviewΒΆ

Warning

The newer com.walmartlabs.lacinia.pedestal2 namespace is recommended over the now-deprecated com.walmartlabs.lacinia.pedestal namespace. The new namespace was introduced to maintain backwards compatibility, but be aware of which you use, as the default URLs served differ with each namespace. This guide assumes you are using the latest pedestal2 namespace and its defaults.

You start with a schema file, resources/hello-world-schema.edn, in this example:

{:queries
 {:hello
  {:type String}}}

From there there are three steps:

  • Load and compile the schema
  • Create a Pedestal service around the schema
  • Start the Pedestal service
(ns demo.server
  (:require
    [clojure.edn :as edn]
    [clojure.java.io :as io]
    [com.walmartlabs.lacinia.pedestal2 :as p2]
    [com.walmartlabs.lacinia.schema :as schema]
    [com.walmartlabs.lacinia.util :as util]
    [io.pedestal.http :as http]))

(defn ^:private resolve-hello
  [context args value]
  "Hello, Clojurians!")

(defn ^:private hello-schema
  []
  (-> (io/resource "hello-world-schema.edn")
      slurp
      edn/read-string
      (util/inject-resolvers {:queries/hello resolve-hello})
      schema/compile))

(def service (-> (hello-schema)
                 (p2/default-service nil)
                 http/create-server
                 http/start))

At the end of this, an instance of Jetty is launched on port 8888.

The GraphQL endpoint will be at http://localhost:8888/api and the GraphIQL client will be at http://localhost:8888/ide.

The options map provided to default-service allow a number of features of Lacinia-Pedestal to be configured or customized, though the intent of default-service is to just be initial scaffolding - it should be replaced with application-specific code.