This is an alternative site for discovering Elm packages. You may be looking for the official Elm package site instead.
We were not able to find the expected elm-package.json file at this tag.
version 1.0.0
license MIT
native-modules False
elm-version 0.18.0 <= v < 0.19.0
Tag 1.0.0
Committed At 2018-08-24 10:19:38 UTC
elm-lang/http 1.0.0 <= v < 2.0.0 1.0.0
elm-lang/html 2.0.0 <= v < 3.0.0 2.0.0
elm-lang/core 5.1.1 <= v < 6.0.0 5.1.1
elm-community/elm-test 4.2.0 <= v < 5.0.0 4.2.0

README

GraphQL in Elm

This package helps you build GraphQL together with Decoders and then build a HTTP request with nice chainable interface (adoptation of lukewestby/elm-http-builder).

Example

Let's imagine that you want to request some information about current user:

module Api exposing (User, me, renameMe)

import GraphQL
import GraphQL.Argument as Argument
import GraphQL.Selector as Selector exposing (Selector)


type Msg
    = ReceiveUserDone (Result Selector.Error User)
    | RenameUserDone (Result Selector.Error User)


type alias User =
    { id : String
    , name : String
    , email : String
    , age : Int
    , rating : Float
    }


userSelector : Selector User
userSelector =
    Selector.map5 User
        (Selector.field "id" [] Selector.string)
        (Selector.field "name" [] Selector.string)
        (Selector.field "email" [] Selector.string)
        (Selector.field "age" [] Selector.int)
        (Selector.field "rating" [] Selector.float)


me : String -> GraphQL.Request User
me token =
    Selector.field "me" [] userSelector
        |> GraphQL.query "GetMe"
        |> GraphQL.post "https://my-awesome-graphql-server.com"
        |> GraphQL.withBearerToken token



-- if you send `me` query like this


meCmd : Cmd Msg
meCmd =
    Selector.send ReceiveUserDone (me "token")



-- it builds `Decoder` which equal to:


meDecoder : Json.Decode.Decoder User
meDecoder =
    -- a user decoder
    Json.Decode.map5 User
        (Json.Decode.field "id" Json.Decode.string)
        (Json.Decode.field "name" Json.Decode.string)
        (Json.Decode.field "email" Json.Decode.string)
        (Json.Decode.field "age" Json.Decode.int)
        (Json.Decode.field "rating" Json.Decode.float)
        -- field of query
        |> Json.Decode.field "me"
        -- configurable container of GraphQL server response
        |> Json.Decode.field "data"



-- and GraphQL:


meGraphQL : String
meGraphQL =
    """
    query RenameMe {
        me {
            id
            name
            email
            age
            rating
        }
    }
    """


renameMe : String -> String -> GraphQL.Request User
renameMe token nextName =
    Selector.field "updateMe"
        [ ( "name", Argument.string name )
        ]
        userSelector
        |> GraphQL.mutation "RenameMe"
        |> GraphQL.post "https://my-awesome-graphql-server.com"
        |> GraphQL.withBearerToken token



-- and if you send `renameMe` mutation like this


renameMeCmd : Cmd Msg
renameMeCmd =
    Selector.send RenameUserDone (renameMe "token" "Newname")



-- it builds `Decoder` which equal to:


renameMeDecoder : Json.Decode.Decoder User
renameMeDecoder =
    -- a user decoder
    Json.Decode.map5 User
        (Json.Decode.field "id" Json.Decode.string)
        (Json.Decode.field "name" Json.Decode.string)
        (Json.Decode.field "email" Json.Decode.string)
        (Json.Decode.field "age" Json.Decode.int)
        (Json.Decode.field "rating" Json.Decode.float)
        -- field of query
        |> Json.Decode.field "updateMe"
        -- configurable container of GraphQL server response
        |> Json.Decode.field "data"



-- and GraphQL:


renameMeGraphQL : String
renameMeGraphQL =
    """
    mutation RenameMe {
        updateMe(name: "Newname") {
            id
            name
            email
            age
            rating
        }
    }
    """

So you need no more to configure Decoders and build GraphQL separately each other! You can do all stuff exactly like with Decoder: combine, nest and reuse described Selectors.