MIT licensed by Daviti Nalchevanidze
Maintained by [email protected]
This version can be pinned in stack with:morpheus-graphql-client-0.27.3@sha256:dfe0ff46fa8a115cce9ff085c2f4d05585fa83fa1ceffe20b78311f3f552cff8,5236

Module documentation for 0.27.3

Morpheus GraphQL Client

Morpheus GraphQL Client with Template haskell QuasiQuotes

declareLocalTypesInline
    "./schema.gql"
  [raw|
    query GetHero ($character: Character)
      {
        deity (fatherOf:$character) {
          name
          power
          worships {
            deity2Name: name
          }
        }
      }
  |]

with schema:

input Character {
  name: String!
}

type Deity {
  name: String!
  worships: Deity
  power: Power!
}

enum Power {
  Lightning
  Teleportation
  Omniscience
}

will validate query and Generate:

  • namespaced response and variable types
  • instance for Fetch typeClass
data GetHero = GetHero {
  deity: DeityDeity
}

-- from: {user
data DeityDeity = DeityDeity {
  name: Text,
  worships: Maybe DeityWorshipsDeity
  power: Power
}

-- from: {deity{worships
data DeityWorshipsDeity = DeityWorshipsDeity {
  name: Text,
}

data Power =
    PowerLightning
  | PowerTeleportation
  | PowerOmniscience

data GetHeroArgs = GetHeroArgs {
  character: Character
}

data Character = Character {
  name: Person
}

as you see, response type field name collision can be handled with GraphQL alias.

with fetch you can fetch well typed response GetHero.

  fetchHero :: Args GetHero -> m (Either String GetHero)
  fetchHero = fetch jsonRes args
      where
        args = GetHeroArgs {character = Person {name = "Zeus"}}
        jsonRes :: ByteString -> m ByteString
        jsonRes = <GraphQL APi>

in this case, jsonRes resolves a request into a response in some monad m.

A fetch resolver implementation against a real API may look like the following:

{-# LANGUAGE OverloadedStrings #-}

import Data.ByteString.Lazy (ByteString)
import qualified Data.ByteString.Char8 as C8
import Network.HTTP.Req

resolver :: String -> ByteString -> IO ByteString
resolver tok b = runReq defaultHttpConfig $ do
    let headers = header "Content-Type" "application/json"
    responseBody <$> req POST (https "swapi.graph.cool") (ReqBodyLbs b) lbsResponse headers

this is demonstrated in examples/src/Client/StarWarsClient.hs

types can be generated from introspection too:

defineByIntrospectionFile "./introspection.json"

Changes

Changelog

see latest changes on Github

0.19.0 - 21.03.2022

0.18.0 - 08.11.2021

Minor Changes

  • added morpheus-graphql-code-gen to dependency

  • Add defineBy*File’ variants that take a Q FilePath #584

  • fixed: Generation of data constructors for non-capitalized enums

  • fixed invalid scalar type generation and added tests to ensure their validity for each upcoming version #583

  • return all response errors gracefully as a Left when fetching #577 - Thanks @AlistairB

0.17.0 - 25.02.2021

Breaking changes

  • GQLScalar was replaced with EncodeScalar and DecodeScalar type-classes.

Minor Changes

  • more likely to rebuild when a file loaded by defineByDocumentFile or defineByIntrospectionFile is changed

0.16.0 - 05.11.2020

Minor Changes

  • parser performance optimization
  • fixed #514: json parser selects interface type as fallback
  • fixed #546: defineByIntrospectionFile support custom (Query,Mutation,Subscription)

0.15.1 - 12.09.2020

0.15.0 - 12.09.2020

minor

  • client capitalizes type names #519

  • fixed client error on field __typename #509

0.14.1 - 16.08.2020

minor

  • fixed Build error during testing #5602

0.14.0 - 15.08.2020

new features

  • supports interfaces.

  • supports of block string values.

  • support of schema. issue #412

    schema {
      query: MyQuery
    }
    
  • generated types have instance of class Eq

breaking changes

  • custom scalars Should Provide instance of class Eq

0.13.0 - 22.06.2020

breaking changes

  • from now you should provide for every custom graphql scalar definition corresponding haskell type definition and GQLScalar implementation fot it.
  • input fields and query arguments are imported without namespace

new features

  • exposed: ScalarValues,GQLScalar, ID

0.12.0 - 21.05.2020