{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Data.Morpheus.Server.Deriving.Resolve
( statelessResolver,
RootResolverConstraint,
coreResolver,
deriveSchema,
)
where
import Data.Functor.Identity (Identity (..))
import Data.Morpheus.Core
( Config,
runApi,
)
import Data.Morpheus.Server.Deriving.Channels (ChannelCon)
import Data.Morpheus.Server.Deriving.Encode
( EncodeCon,
deriveModel,
)
import Data.Morpheus.Server.Deriving.Introspect
( IntroCon,
deriveSchema,
)
import Data.Morpheus.Types
( RootResolver (..),
)
import Data.Morpheus.Types.IO
( GQLRequest (..),
GQLResponse (..),
renderResponse,
)
import Data.Morpheus.Types.Internal.AST
( MUTATION,
QUERY,
SUBSCRIPTION,
VALID,
Value,
)
import Data.Morpheus.Types.Internal.Resolving
( Resolver,
ResponseStream,
ResultT (..),
)
type OperationConstraint operation event m a =
( EncodeCon operation event m (a (Resolver operation event m)),
IntroCon (a (Resolver operation event m))
)
type RootResolverConstraint m event query mutation subscription =
( Monad m,
OperationConstraint QUERY event m query,
OperationConstraint MUTATION event m mutation,
OperationConstraint SUBSCRIPTION event m subscription,
ChannelCon event m subscription
)
statelessResolver ::
RootResolverConstraint m event query mut sub =>
RootResolver m event query mut sub ->
Config ->
GQLRequest ->
m GQLResponse
statelessResolver root config req =
renderResponse <$> runResultT (coreResolver root config req)
coreResolver ::
RootResolverConstraint m event query mut sub =>
RootResolver m event query mut sub ->
Config ->
GQLRequest ->
ResponseStream event m (Value VALID)
coreResolver root config request = do
schema <- deriveSchema (Identity root)
runApi schema (deriveModel root) config request