morpheus-graphql-0.0.1: src/Data/Morpheus/Kind/GQLMutation.hs
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE DisambiguateRecordFields #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators #-}
module Data.Morpheus.Kind.GQLMutation
( GQLMutation(..)
) where
import Data.Morpheus.Generics.DeriveResolvers (DeriveResolvers (..), resolveBySelection)
import Data.Morpheus.Generics.TypeRep (Selectors (..), resolveTypes)
import Data.Morpheus.Schema.Internal.Types (Core (..), GObject (..), ObjectField, TypeLib (..))
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 GQLMutation a where
encodeMutation :: a -> SelectionSet -> ResolveIO JSType
default encodeMutation :: (Generic a, DeriveResolvers (Rep a)) =>
a -> SelectionSet -> ResolveIO JSType
encodeMutation rootResolver sel = resolveBySelection sel $ deriveResolvers initialMeta $ from rootResolver
mutationSchema :: a -> TypeLib -> TypeLib
default mutationSchema :: (Selectors (Rep a) (Text, ObjectField)) =>
a -> TypeLib -> TypeLib
mutationSchema _ initialType = resolveTypes mutationType types
where
mutationType = initialType {mutation = Just ("Mutation", GObject fields $ Core "Mutation" "Description")}
fieldTypes = getFields (Proxy :: Proxy (Rep a))
types = map snd fieldTypes
fields = map fst fieldTypes
instance GQLMutation () where
encodeMutation _ _ = pure JSNull
mutationSchema _ = id