The auto-generated code from the @dillonkearns/elm-graphql CLI will provide selection
functions for Objects, Interfaces, and Unions in your GraphQL schema.
These functions build up a Graphql.SelectionSet which describes a set
of fields to retrieve. The SelectionSet is built up in a pipeline similar to how
Json.Decode.Pipeline
builds up decoders.
For example, if you had a top-level query human(id: ID!) which returns an object
of type Human, you could build the following GraphQL query document:
query {
human(id: 1001) {
name
id
}
}In this example, the SelectionSet on human is:
{
name
id
}You could build up the above SelectionSet with the following dillonkearns/elm-graphql code:
import Api.Object
import Api.Object.Human as Human
import Graphql.SelectionSet exposing (SelectionSet, with)
type alias Human =
{ name : String
, id : String
}
hero : SelectionSet Hero Api.Interface.Human
hero =
Human.selection Human
|> with Human.name
|> with Human.idNote that all of the modules under Api. in this case are generated by running
the @dillonkearns/elm-graphql command line tool.
The query itself is also a SelectionSet so it is built up similarly.
See this live code demo for an example.
Include a hardcoded value.
import Api.Enum.Episode as Episode exposing (Episode)
import Api.Object
import Graphql.SelectionSet exposing (SelectionSet, with, hardcoded)
type alias Hero =
{ name : String
, movie : String
}
hero : SelectionSet Hero Api.Interface.Character
hero =
Character.commonSelection Hero
|> with Character.name
|> hardcoded "Star Wars"Useful for Mutations when you don't want any data back.
import Api.Mutation as Mutation
import Graphql.Operation exposing (RootMutation)
import Graphql.SelectionSet as SelectionSet exposing (SelectionSet, with)
sendChatMessage : String -> SelectionSet () RootMutation
sendChatMessage message =
Mutation.selection identity
|> with (Mutation.sendMessage { message = message } SelectionSet.empty)Apply a function to change the result of decoding the SelectionSet.
Instead of hardcoding a field like hardcoded, SelectionSet.succeed hardcodes
an entire SelectionSet. This can be useful if you want hardcoded data based on
only the type when using a polymorphic type (Interface or Union).
type alias Character =
{ details : Maybe HumanOrDroid
, name : String
}
type HumanOrDroid
= Human
| Droid
hero : SelectionSet Character Swapi.Interface.Character
hero =
Character.selection Character
[ Character.onDroid (SelectionSet.succeed Droid)
, Character.onHuman (SelectionSet.succeed Human)
]
|> with Character.nameCreate a SelectionSet from a single Field.
import Api.Object
import Api.Object.Human as Human
import Graphql.SelectionSet exposing (SelectionSet)
humanSelection : SelectionSet String Api.Object.Human
humanSelection =
SelectionSet.fieldSelection Human.nameThese types are built for you by the code generated by the @dillonkearns/elm-graphql command line tool.
SelectionSet type
FragmentSelectionSet type
Used to pick out fields on an object.