morpheus-graphql-0.0.1: src/Data/Morpheus/Kind/GQLQuery.hs
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE DisambiguateRecordFields #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
module Data.Morpheus.Kind.GQLQuery
( GQLQuery(..)
) where
import Data.Morpheus.Generics.DeriveResolvers (DeriveResolvers (..), resolveBySelection)
import Data.Morpheus.Generics.TypeRep (Selectors (..), resolveTypes)
import Data.Morpheus.Kind.GQLObject (GQLObject (..))
import Data.Morpheus.Schema.Internal.Types (Core (..), GObject (..), ObjectField, TypeLib, initTypeLib)
import Data.Morpheus.Schema.Schema (Schema, initSchema)
import Data.Morpheus.Types.Error (ResolveIO)
import Data.Morpheus.Types.JSType (JSType (..))
import Data.Morpheus.Types.MetaInfo (initialMeta)
import Data.Morpheus.Types.Query.Selection (SelectionSet)
import Data.Proxy
import Data.Text (Text)
import GHC.Generics
class GQLQuery a where
encodeQuery :: a -> TypeLib -> SelectionSet -> ResolveIO JSType
default encodeQuery :: (Generic a, DeriveResolvers (Rep a)) =>
a -> TypeLib -> SelectionSet -> ResolveIO JSType
encodeQuery rootResolver types sel = resolveBySelection sel (schemaResolver ++ resolvers)
where
schemaResolver = [("__schema", (`encode` initSchema types))]
resolvers = deriveResolvers initialMeta $ from rootResolver
querySchema :: a -> TypeLib
default querySchema :: (Selectors (Rep a) (Text, ObjectField)) =>
a -> TypeLib
querySchema _ = resolveTypes typeLib stack
where
typeLib = introspect (Proxy @Schema) queryType
queryType = initTypeLib ("Query", GObject fields (Core "Query" "Description"))
fieldTypes = getFields (Proxy @(Rep a))
stack = map snd fieldTypes
fields = map fst fieldTypes