{-# LANGUAGE CPP #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Data.Morpheus.App.Internal.Resolving.Resolver
  ( Resolver,
    LiftOperation,
    ResponseEvent (..),
    ResponseStream,
    WithOperation,
    SubscriptionField (..),
  )
where

import Control.Monad.Except (MonadError (..))
import Control.Monad.Trans.Reader (mapReaderT)
import Data.Morpheus.App.Internal.Resolving.Event
  ( EventHandler (..),
    ResponseEvent (..),
  )
import Data.Morpheus.App.Internal.Resolving.MonadResolver
  ( MonadIOResolver,
    MonadResolver (..),
    SubscriptionField (..),
  )
import Data.Morpheus.App.Internal.Resolving.ResolverState
  ( ResolverContext (..),
    ResolverState,
    ResolverStateT (..),
    clearStateResolverEvents,
    resolverFailureMessage,
    runResolverState,
    runResolverStateT,
    runResolverStateValueM,
    toResolverStateT,
  )
import Data.Morpheus.Internal.Ext
  ( GQLResult,
    PushEvents (..),
    Result (..),
    ResultT (..),
    cleanEvents,
    mapEvent,
  )
import Data.Morpheus.Types.IO
  ( GQLResponse,
    renderResponse,
  )
import Data.Morpheus.Types.Internal.AST
  ( GQLError,
    MUTATION,
    OperationType (..),
    QUERY,
    SUBSCRIPTION,
    Selection (..),
    VALID,
    ValidValue,
    Value (..),
    msg,
  )
import Relude hiding
  ( Show,
    empty,
    show,
  )
import Prelude (Show (..))

type WithOperation (o :: OperationType) = LiftOperation o

type ResponseStream event (m :: Type -> Type) = ResultT (ResponseEvent event m) m

-- GraphQL resolver
---------------------------------------------------------------
data Resolver (o :: OperationType) event (m :: Type -> Type) value where
  ResolverQ :: {forall (m :: * -> *) value event.
Resolver 'OPERATION_QUERY event m value
-> ResolverStateT () m value
runResolverQ :: ResolverStateT () m value} -> Resolver QUERY event m value
  ResolverM :: {forall event (m :: * -> *) value.
Resolver 'OPERATION_MUTATION event m value
-> ResolverStateT event m value
runResolverM :: ResolverStateT event m value} -> Resolver MUTATION event m value
  ResolverS :: {forall (m :: * -> *) event value.
Resolver 'OPERATION_SUBSCRIPTION event m value
-> ResolverStateT () m (SubEventRes event m value)
runResolverS :: ResolverStateT () m (SubEventRes event m value)} -> Resolver SUBSCRIPTION event m value

instance (LiftOperation o, Monad m, MonadIO m) => MonadIOResolver (Resolver o e m)

instance (LiftOperation o, Monad m) => MonadResolver (Resolver o e m) where
  type MonadOperation (Resolver o e m) = o
  type MonadEvent (Resolver o e m) = e
  type MonadQuery (Resolver o e m) = (Resolver QUERY e m)
  type MonadMutation (Resolver o e m) = (Resolver MUTATION e m)
  type MonadSubscription (Resolver o e m) = (Resolver SUBSCRIPTION e m)
  type MonadParam (Resolver o e m) = m
  getArguments :: Resolver o e m (Arguments VALID)
getArguments = (ResolverContext -> Arguments VALID)
-> Resolver o e m (Arguments VALID)
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks (Selection VALID -> Arguments VALID
forall (s :: Stage). Selection s -> Arguments s
selectionArguments (Selection VALID -> Arguments VALID)
-> (ResolverContext -> Selection VALID)
-> ResolverContext
-> Arguments VALID
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ResolverContext -> Selection VALID
currentSelection)
  liftState :: forall a. ResolverState a -> Resolver o e m a
liftState = ResolverStateT e m a -> Resolver o e m a
forall (o :: OperationType) (m :: * -> *) e a.
(LiftOperation o, Monad m) =>
ResolverStateT e m a -> Resolver o e m a
forall (m :: * -> *) e a.
Monad m =>
ResolverStateT e m a -> Resolver o e m a
packResolver (ResolverStateT e m a -> Resolver o e m a)
-> (ResolverState a -> ResolverStateT e m a)
-> ResolverState a
-> Resolver o e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ResolverState a -> ResolverStateT e m a
forall (m :: * -> *) a e.
Applicative m =>
ResolverState a -> ResolverStateT e m a
toResolverStateT
  subscribe :: forall a.
(MonadOperation (Resolver o e m) ~ 'OPERATION_SUBSCRIPTION) =>
Channel (MonadEvent (Resolver o e m))
-> MonadQuery
     (Resolver o e m) (MonadEvent (Resolver o e m) -> Resolver o e m a)
-> SubscriptionField (Resolver o e m a)
subscribe Channel (MonadEvent (Resolver o e m))
ch MonadQuery
  (Resolver o e m) (MonadEvent (Resolver o e m) -> Resolver o e m a)
res = (forall (m :: * -> *) v.
 (Resolver o e m a ~ m v, MonadResolver m,
  MonadOperation m ~ 'OPERATION_SUBSCRIPTION) =>
 Channel (MonadEvent m))
-> Resolver o e m a -> SubscriptionField (Resolver o e m a)
forall a.
(forall (m :: * -> *) v.
 (a ~ m v, MonadResolver m,
  MonadOperation m ~ 'OPERATION_SUBSCRIPTION) =>
 Channel (MonadEvent m))
-> a -> SubscriptionField a
SubscriptionField Channel (MonadEvent m)
Channel (MonadEvent (Resolver o e m))
forall (m :: * -> *) v.
(Resolver o e m a ~ m v, MonadResolver m,
 MonadOperation m ~ 'OPERATION_SUBSCRIPTION) =>
Channel (MonadEvent m)
ch (ResolverStateT () m (SubEventRes e m a)
-> Resolver 'OPERATION_SUBSCRIPTION e m a
forall (m :: * -> *) event value.
ResolverStateT () m (SubEventRes event m value)
-> Resolver 'OPERATION_SUBSCRIPTION event m value
ResolverS ((e -> Resolver 'OPERATION_SUBSCRIPTION e m a) -> SubEventRes e m a
forall {m :: * -> *} {r} {a}.
Monad m =>
(r -> Resolver 'OPERATION_SUBSCRIPTION r m a)
-> ReaderT r (ResolverStateT () m) a
runSubscription ((e -> Resolver 'OPERATION_SUBSCRIPTION e m a)
 -> SubEventRes e m a)
-> ResolverStateT
     () m (e -> Resolver 'OPERATION_SUBSCRIPTION e m a)
-> ResolverStateT () m (SubEventRes e m a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Resolver
  'OPERATION_QUERY e m (e -> Resolver 'OPERATION_SUBSCRIPTION e m a)
-> ResolverStateT
     () m (e -> Resolver 'OPERATION_SUBSCRIPTION e m a)
forall (m :: * -> *) value event.
Resolver 'OPERATION_QUERY event m value
-> ResolverStateT () m value
runResolverQ MonadQuery
  (Resolver o e m) (MonadEvent (Resolver o e m) -> Resolver o e m a)
Resolver
  'OPERATION_QUERY e m (e -> Resolver 'OPERATION_SUBSCRIPTION e m a)
res))
    where
      runSubscription :: (r -> Resolver 'OPERATION_SUBSCRIPTION r m a)
-> ReaderT r (ResolverStateT () m) a
runSubscription r -> Resolver 'OPERATION_SUBSCRIPTION r m a
f = ReaderT r (ResolverStateT () m) (ReaderT r (ResolverStateT () m) a)
-> ReaderT r (ResolverStateT () m) a
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join ((r -> ResolverStateT () m (ReaderT r (ResolverStateT () m) a))
-> ReaderT
     r (ResolverStateT () m) (ReaderT r (ResolverStateT () m) a)
forall r (m :: * -> *) a. (r -> m a) -> ReaderT r m a
ReaderT (Resolver 'OPERATION_SUBSCRIPTION r m a
-> ResolverStateT () m (ReaderT r (ResolverStateT () m) a)
forall (m :: * -> *) event value.
Resolver 'OPERATION_SUBSCRIPTION event m value
-> ResolverStateT () m (SubEventRes event m value)
runResolverS (Resolver 'OPERATION_SUBSCRIPTION r m a
 -> ResolverStateT () m (ReaderT r (ResolverStateT () m) a))
-> (r -> Resolver 'OPERATION_SUBSCRIPTION r m a)
-> r
-> ResolverStateT () m (ReaderT r (ResolverStateT () m) a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. r -> Resolver 'OPERATION_SUBSCRIPTION r m a
f))
  publish :: (MonadOperation (Resolver o e m) ~ 'OPERATION_MUTATION) =>
[MonadEvent (Resolver o e m)] -> Resolver o e m ()
publish = [e] -> Resolver o e m ()
[MonadEvent (Resolver o e m)] -> Resolver o e m ()
forall e (m :: * -> *). PushEvents e m => [e] -> m ()
pushEvents
  runResolver :: Maybe
  (Selection VALID
   -> ResolverState (Channel (MonadEvent (Resolver o e m))))
-> Resolver o e m ValidValue
-> ResolverContext
-> ResponseStream
     (MonadEvent (Resolver o e m))
     (MonadParam (Resolver o e m))
     ValidValue
runResolver Maybe
  (Selection VALID
   -> ResolverState (Channel (MonadEvent (Resolver o e m))))
_ (ResolverQ ResolverStateT () m ValidValue
resT) ResolverContext
sel = ResultT () (MonadParam (Resolver o e m)) ValidValue
-> ResponseStream
     (MonadEvent (Resolver o e m))
     (MonadParam (Resolver o e m))
     ValidValue
forall (m :: * -> *) e a e'.
Functor m =>
ResultT e m a -> ResultT e' m a
cleanEvents (ResultT () (MonadParam (Resolver o e m)) ValidValue
 -> ResponseStream
      (MonadEvent (Resolver o e m))
      (MonadParam (Resolver o e m))
      ValidValue)
-> ResultT () (MonadParam (Resolver o e m)) ValidValue
-> ResponseStream
     (MonadEvent (Resolver o e m))
     (MonadParam (Resolver o e m))
     ValidValue
forall a b. (a -> b) -> a -> b
$ ResolverStateT () m ValidValue
-> ResolverContext -> ResultT () m ValidValue
forall e (m :: * -> *) a.
ResolverStateT e m a -> ResolverContext -> ResultT e m a
runResolverStateT ResolverStateT () m ValidValue
resT ResolverContext
sel
  runResolver Maybe
  (Selection VALID
   -> ResolverState (Channel (MonadEvent (Resolver o e m))))
_ (ResolverM ResolverStateT e m ValidValue
resT) ResolverContext
sel = (e
 -> ResponseEvent
      (MonadEvent (Resolver o e m)) (MonadParam (Resolver o e m)))
-> ResultT e (MonadParam (Resolver o e m)) ValidValue
-> ResponseStream
     (MonadEvent (Resolver o e m))
     (MonadParam (Resolver o e m))
     ValidValue
forall (m :: * -> *) e e' value.
Monad m =>
(e -> e') -> ResultT e m value -> ResultT e' m value
mapEvent e -> ResponseEvent e m
e
-> ResponseEvent
     (MonadEvent (Resolver o e m)) (MonadParam (Resolver o e m))
forall event (m :: * -> *). event -> ResponseEvent event m
Publish (ResultT e (MonadParam (Resolver o e m)) ValidValue
 -> ResponseStream
      (MonadEvent (Resolver o e m))
      (MonadParam (Resolver o e m))
      ValidValue)
-> ResultT e (MonadParam (Resolver o e m)) ValidValue
-> ResponseStream
     (MonadEvent (Resolver o e m))
     (MonadParam (Resolver o e m))
     ValidValue
forall a b. (a -> b) -> a -> b
$ ResolverStateT e m ValidValue
-> ResolverContext -> ResultT e m ValidValue
forall e (m :: * -> *) a.
ResolverStateT e m a -> ResolverContext -> ResultT e m a
runResolverStateT ResolverStateT e m ValidValue
resT ResolverContext
sel
  runResolver Maybe
  (Selection VALID
   -> ResolverState (Channel (MonadEvent (Resolver o e m))))
toChannel (ResolverS ResolverStateT () m (SubEventRes e m ValidValue)
resT) ResolverContext
ctx = MonadParam
  (Resolver o e m)
  (Result
     GQLError
     ([ResponseEvent
         (MonadEvent (Resolver o e m)) (MonadParam (Resolver o e m))],
      ValidValue))
-> ResponseStream
     (MonadEvent (Resolver o e m))
     (MonadParam (Resolver o e m))
     ValidValue
forall event (m :: * -> *) a.
m (Result GQLError ([event], a)) -> ResultT event m a
ResultT (MonadParam
   (Resolver o e m)
   (Result
      GQLError
      ([ResponseEvent
          (MonadEvent (Resolver o e m)) (MonadParam (Resolver o e m))],
       ValidValue))
 -> ResponseStream
      (MonadEvent (Resolver o e m))
      (MonadParam (Resolver o e m))
      ValidValue)
-> MonadParam
     (Resolver o e m)
     (Result
        GQLError
        ([ResponseEvent
            (MonadEvent (Resolver o e m)) (MonadParam (Resolver o e m))],
         ValidValue))
-> ResponseStream
     (MonadEvent (Resolver o e m))
     (MonadParam (Resolver o e m))
     ValidValue
forall a b. (a -> b) -> a -> b
$ do
    Result GQLError (SubEventRes e m ValidValue)
readResValue <- ResolverStateT () m (SubEventRes e m ValidValue)
-> ResolverContext
-> m (Result GQLError (SubEventRes e m ValidValue))
forall (m :: * -> *) e a.
Functor m =>
ResolverStateT e m a -> ResolverContext -> m (Result GQLError a)
runResolverStateValueM ResolverStateT () m (SubEventRes e m ValidValue)
resT ResolverContext
ctx
    Result GQLError ([ResponseEvent e m], ValidValue)
-> m (Result GQLError ([ResponseEvent e m], ValidValue))
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Result GQLError ([ResponseEvent e m], ValidValue)
 -> m (Result GQLError ([ResponseEvent e m], ValidValue)))
-> Result GQLError ([ResponseEvent e m], ValidValue)
-> m (Result GQLError ([ResponseEvent e m], ValidValue))
forall a b. (a -> b) -> a -> b
$ case Result GQLError (SubEventRes e m ValidValue)
readResValue Result GQLError (SubEventRes e m ValidValue)
-> (SubEventRes e m ValidValue
    -> Result GQLError (ResponseEvent e m))
-> Result GQLError (ResponseEvent e m)
forall a b.
Result GQLError a -> (a -> Result GQLError b) -> Result GQLError b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ResolverContext
-> Maybe (Selection VALID -> ResolverState (Channel e))
-> (e -> m GQLResponse)
-> Result GQLError (ResponseEvent e m)
forall e (m :: * -> *).
ResolverContext
-> Maybe (Selection VALID -> ResolverState (Channel e))
-> (e -> m GQLResponse)
-> GQLResult (ResponseEvent e m)
subscriptionEvents ResolverContext
ctx Maybe (Selection VALID -> ResolverState (Channel e))
Maybe
  (Selection VALID
   -> ResolverState (Channel (MonadEvent (Resolver o e m))))
toChannel ((e -> m GQLResponse) -> Result GQLError (ResponseEvent e m))
-> (SubEventRes e m ValidValue -> e -> m GQLResponse)
-> SubEventRes e m ValidValue
-> Result GQLError (ResponseEvent e m)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ResolverContext -> SubEventRes e m ValidValue -> e -> m GQLResponse
forall (m :: * -> *) event.
Monad m =>
ResolverContext
-> SubEventRes event m ValidValue -> event -> m GQLResponse
toEventResolver ResolverContext
ctx of
      Failure NonEmpty GQLError
x -> NonEmpty GQLError
-> Result GQLError ([ResponseEvent e m], ValidValue)
forall err a. NonEmpty err -> Result err a
Failure NonEmpty GQLError
x
      Success {[GQLError]
warnings :: [GQLError]
warnings :: forall err a. Result err a -> [err]
warnings, ResponseEvent e m
result :: ResponseEvent e m
result :: forall err a. Result err a -> a
result} -> Success {[GQLError]
warnings :: [GQLError]
warnings :: [GQLError]
warnings, result :: ([ResponseEvent e m], ValidValue)
result = ([ResponseEvent e m
result], ValidValue
forall (stage :: Stage). Value stage
Null)}

type SubEventRes event m value = ReaderT event (ResolverStateT () m) value

instance Show (Resolver o e m value) where
  show :: Resolver o e m value -> String
show ResolverQ {} = String
"Resolver QUERY e m a"
  show ResolverM {} = String
"Resolver MUTATION e m a"
  show ResolverS {} = String
"Resolver SUBSCRIPTION e m a"

deriving instance (Functor m) => Functor (Resolver o e m)

-- Applicative
instance (LiftOperation o, Monad m) => Applicative (Resolver o e m) where
  pure :: forall a. a -> Resolver o e m a
pure = ResolverStateT e m a -> Resolver o e m a
forall (o :: OperationType) (m :: * -> *) e a.
(LiftOperation o, Monad m) =>
ResolverStateT e m a -> Resolver o e m a
forall (m :: * -> *) e a.
Monad m =>
ResolverStateT e m a -> Resolver o e m a
packResolver (ResolverStateT e m a -> Resolver o e m a)
-> (a -> ResolverStateT e m a) -> a -> Resolver o e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> ResolverStateT e m a
forall a. a -> ResolverStateT e m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
  ResolverQ ResolverStateT () m (a -> b)
r1 <*> :: forall a b.
Resolver o e m (a -> b) -> Resolver o e m a -> Resolver o e m b
<*> ResolverQ ResolverStateT () m a
r2 = ResolverStateT () m b -> Resolver 'OPERATION_QUERY e m b
forall (m :: * -> *) value event.
ResolverStateT () m value
-> Resolver 'OPERATION_QUERY event m value
ResolverQ (ResolverStateT () m b -> Resolver 'OPERATION_QUERY e m b)
-> ResolverStateT () m b -> Resolver 'OPERATION_QUERY e m b
forall a b. (a -> b) -> a -> b
$ ResolverStateT () m (a -> b)
r1 ResolverStateT () m (a -> b)
-> ResolverStateT () m a -> ResolverStateT () m b
forall a b.
ResolverStateT () m (a -> b)
-> ResolverStateT () m a -> ResolverStateT () m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ResolverStateT () m a
r2
  ResolverM ResolverStateT e m (a -> b)
r1 <*> ResolverM ResolverStateT e m a
r2 = ResolverStateT e m b -> Resolver 'OPERATION_MUTATION e m b
forall event (m :: * -> *) value.
ResolverStateT event m value
-> Resolver 'OPERATION_MUTATION event m value
ResolverM (ResolverStateT e m b -> Resolver 'OPERATION_MUTATION e m b)
-> ResolverStateT e m b -> Resolver 'OPERATION_MUTATION e m b
forall a b. (a -> b) -> a -> b
$ ResolverStateT e m (a -> b)
r1 ResolverStateT e m (a -> b)
-> ResolverStateT e m a -> ResolverStateT e m b
forall a b.
ResolverStateT e m (a -> b)
-> ResolverStateT e m a -> ResolverStateT e m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ResolverStateT e m a
r2
  ResolverS ResolverStateT () m (SubEventRes e m (a -> b))
r1 <*> ResolverS ResolverStateT () m (SubEventRes e m a)
r2 = ResolverStateT () m (SubEventRes e m b)
-> Resolver 'OPERATION_SUBSCRIPTION e m b
forall (m :: * -> *) event value.
ResolverStateT () m (SubEventRes event m value)
-> Resolver 'OPERATION_SUBSCRIPTION event m value
ResolverS (ResolverStateT () m (SubEventRes e m b)
 -> Resolver 'OPERATION_SUBSCRIPTION e m b)
-> ResolverStateT () m (SubEventRes e m b)
-> Resolver 'OPERATION_SUBSCRIPTION e m b
forall a b. (a -> b) -> a -> b
$ SubEventRes e m (a -> b) -> SubEventRes e m a -> SubEventRes e m b
forall a b.
ReaderT e (ResolverStateT () m) (a -> b)
-> ReaderT e (ResolverStateT () m) a
-> ReaderT e (ResolverStateT () m) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
(<*>) (SubEventRes e m (a -> b)
 -> SubEventRes e m a -> SubEventRes e m b)
-> ResolverStateT () m (SubEventRes e m (a -> b))
-> ResolverStateT () m (SubEventRes e m a -> SubEventRes e m b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ResolverStateT () m (SubEventRes e m (a -> b))
r1 ResolverStateT () m (SubEventRes e m a -> SubEventRes e m b)
-> ResolverStateT () m (SubEventRes e m a)
-> ResolverStateT () m (SubEventRes e m b)
forall a b.
ResolverStateT () m (a -> b)
-> ResolverStateT () m a -> ResolverStateT () m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ResolverStateT () m (SubEventRes e m a)
r2

-- Monad
instance (Monad m, LiftOperation o) => Monad (Resolver o e m) where
  return :: forall a. a -> Resolver o e m a
return = a -> Resolver o e m a
forall a. a -> Resolver o e m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
  (ResolverQ ResolverStateT () m a
x) >>= :: forall a b.
Resolver o e m a -> (a -> Resolver o e m b) -> Resolver o e m b
>>= a -> Resolver o e m b
m2 = ResolverStateT () m b -> Resolver 'OPERATION_QUERY e m b
forall (m :: * -> *) value event.
ResolverStateT () m value
-> Resolver 'OPERATION_QUERY event m value
ResolverQ (ResolverStateT () m a
x ResolverStateT () m a
-> (a -> ResolverStateT () m b) -> ResolverStateT () m b
forall a b.
ResolverStateT () m a
-> (a -> ResolverStateT () m b) -> ResolverStateT () m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Resolver 'OPERATION_QUERY e m b -> ResolverStateT () m b
forall (m :: * -> *) value event.
Resolver 'OPERATION_QUERY event m value
-> ResolverStateT () m value
runResolverQ (Resolver 'OPERATION_QUERY e m b -> ResolverStateT () m b)
-> (a -> Resolver 'OPERATION_QUERY e m b)
-> a
-> ResolverStateT () m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Resolver o e m b
a -> Resolver 'OPERATION_QUERY e m b
m2)
  (ResolverM ResolverStateT e m a
x) >>= a -> Resolver o e m b
m2 = ResolverStateT e m b -> Resolver 'OPERATION_MUTATION e m b
forall event (m :: * -> *) value.
ResolverStateT event m value
-> Resolver 'OPERATION_MUTATION event m value
ResolverM (ResolverStateT e m a
x ResolverStateT e m a
-> (a -> ResolverStateT e m b) -> ResolverStateT e m b
forall a b.
ResolverStateT e m a
-> (a -> ResolverStateT e m b) -> ResolverStateT e m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Resolver 'OPERATION_MUTATION e m b -> ResolverStateT e m b
forall event (m :: * -> *) value.
Resolver 'OPERATION_MUTATION event m value
-> ResolverStateT event m value
runResolverM (Resolver 'OPERATION_MUTATION e m b -> ResolverStateT e m b)
-> (a -> Resolver 'OPERATION_MUTATION e m b)
-> a
-> ResolverStateT e m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Resolver o e m b
a -> Resolver 'OPERATION_MUTATION e m b
m2)
  (ResolverS ResolverStateT () m (SubEventRes e m a)
res) >>= a -> Resolver o e m b
m2 = ResolverStateT () m (SubEventRes e m b)
-> Resolver 'OPERATION_SUBSCRIPTION e m b
forall (m :: * -> *) event value.
ResolverStateT () m (SubEventRes event m value)
-> Resolver 'OPERATION_SUBSCRIPTION event m value
ResolverS ((a -> Resolver 'OPERATION_SUBSCRIPTION e m b)
-> SubEventRes e m a -> SubEventRes e m b
forall (m :: * -> *) t r a.
Monad m =>
(t -> Resolver 'OPERATION_SUBSCRIPTION r m a)
-> ReaderT r (ResolverStateT () m) t
-> ReaderT r (ResolverStateT () m) a
liftSubResolver a -> Resolver o e m b
a -> Resolver 'OPERATION_SUBSCRIPTION e m b
m2 (SubEventRes e m a -> SubEventRes e m b)
-> ResolverStateT () m (SubEventRes e m a)
-> ResolverStateT () m (SubEventRes e m b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ResolverStateT () m (SubEventRes e m a)
res)

liftSubResolver ::
  (Monad m) =>
  (t -> Resolver SUBSCRIPTION r m a) ->
  ReaderT r (ResolverStateT () m) t ->
  ReaderT r (ResolverStateT () m) a
liftSubResolver :: forall (m :: * -> *) t r a.
Monad m =>
(t -> Resolver 'OPERATION_SUBSCRIPTION r m a)
-> ReaderT r (ResolverStateT () m) t
-> ReaderT r (ResolverStateT () m) a
liftSubResolver t -> Resolver 'OPERATION_SUBSCRIPTION r m a
m2 ReaderT r (ResolverStateT () m) t
readResA = (r -> ResolverStateT () m a) -> ReaderT r (ResolverStateT () m) a
forall r (m :: * -> *) a. (r -> m a) -> ReaderT r m a
ReaderT ((r -> ResolverStateT () m a) -> ReaderT r (ResolverStateT () m) a)
-> (r -> ResolverStateT () m a)
-> ReaderT r (ResolverStateT () m) a
forall a b. (a -> b) -> a -> b
$ \r
e -> do
  t
a <- ReaderT r (ResolverStateT () m) t -> r -> ResolverStateT () m t
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT ReaderT r (ResolverStateT () m) t
readResA r
e
  ReaderT r (ResolverStateT () m) a
readResB <- Resolver 'OPERATION_SUBSCRIPTION r m a
-> ResolverStateT () m (ReaderT r (ResolverStateT () m) a)
forall (m :: * -> *) event value.
Resolver 'OPERATION_SUBSCRIPTION event m value
-> ResolverStateT () m (SubEventRes event m value)
runResolverS (t -> Resolver 'OPERATION_SUBSCRIPTION r m a
m2 t
a)
  ReaderT r (ResolverStateT () m) a -> r -> ResolverStateT () m a
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT ReaderT r (ResolverStateT () m) a
readResB r
e

-- MonadIO
instance (MonadIO m, LiftOperation o) => MonadIO (Resolver o e m) where
  liftIO :: forall a. IO a -> Resolver o e m a
liftIO = m a -> Resolver o e m a
forall (m :: * -> *) a. Monad m => m a -> Resolver o e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> Resolver o e m a)
-> (IO a -> m a) -> IO a -> Resolver o e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO a -> m a
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO

-- Monad Transformers
instance (LiftOperation o) => MonadTrans (Resolver o e) where
  lift :: forall (m :: * -> *) a. Monad m => m a -> Resolver o e m a
lift = ResolverStateT e m a -> Resolver o e m a
forall (o :: OperationType) (m :: * -> *) e a.
(LiftOperation o, Monad m) =>
ResolverStateT e m a -> Resolver o e m a
forall (m :: * -> *) e a.
Monad m =>
ResolverStateT e m a -> Resolver o e m a
packResolver (ResolverStateT e m a -> Resolver o e m a)
-> (m a -> ResolverStateT e m a) -> m a -> Resolver o e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m a -> ResolverStateT e m a
forall (m :: * -> *) a. Monad m => m a -> ResolverStateT e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift

-- Failure
instance (LiftOperation o, Monad m) => MonadError GQLError (Resolver o e m) where
  throwError :: forall a. GQLError -> Resolver o e m a
throwError = ResolverStateT e m a -> Resolver o e m a
forall (o :: OperationType) (m :: * -> *) e a.
(LiftOperation o, Monad m) =>
ResolverStateT e m a -> Resolver o e m a
forall (m :: * -> *) e a.
Monad m =>
ResolverStateT e m a -> Resolver o e m a
packResolver (ResolverStateT e m a -> Resolver o e m a)
-> (GQLError -> ResolverStateT e m a)
-> GQLError
-> Resolver o e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GQLError -> ResolverStateT e m a
forall a. GQLError -> ResolverStateT e m a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError
  catchError :: forall a.
Resolver o e m a
-> (GQLError -> Resolver o e m a) -> Resolver o e m a
catchError (ResolverQ ResolverStateT () m a
r) GQLError -> Resolver o e m a
f = ResolverStateT () m a -> Resolver 'OPERATION_QUERY e m a
forall (m :: * -> *) value event.
ResolverStateT () m value
-> Resolver 'OPERATION_QUERY event m value
ResolverQ (ResolverStateT () m a -> Resolver 'OPERATION_QUERY e m a)
-> ResolverStateT () m a -> Resolver 'OPERATION_QUERY e m a
forall a b. (a -> b) -> a -> b
$ ResolverStateT () m a
-> (GQLError -> ResolverStateT () m a) -> ResolverStateT () m a
forall a.
ResolverStateT () m a
-> (GQLError -> ResolverStateT () m a) -> ResolverStateT () m a
forall e (m :: * -> *) a.
MonadError e m =>
m a -> (e -> m a) -> m a
catchError ResolverStateT () m a
r (Resolver 'OPERATION_QUERY e m a -> ResolverStateT () m a
forall (m :: * -> *) value event.
Resolver 'OPERATION_QUERY event m value
-> ResolverStateT () m value
runResolverQ (Resolver 'OPERATION_QUERY e m a -> ResolverStateT () m a)
-> (GQLError -> Resolver 'OPERATION_QUERY e m a)
-> GQLError
-> ResolverStateT () m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GQLError -> Resolver o e m a
GQLError -> Resolver 'OPERATION_QUERY e m a
f)
  catchError (ResolverM ResolverStateT e m a
r) GQLError -> Resolver o e m a
f = ResolverStateT e m a -> Resolver 'OPERATION_MUTATION e m a
forall event (m :: * -> *) value.
ResolverStateT event m value
-> Resolver 'OPERATION_MUTATION event m value
ResolverM (ResolverStateT e m a -> Resolver 'OPERATION_MUTATION e m a)
-> ResolverStateT e m a -> Resolver 'OPERATION_MUTATION e m a
forall a b. (a -> b) -> a -> b
$ ResolverStateT e m a
-> (GQLError -> ResolverStateT e m a) -> ResolverStateT e m a
forall a.
ResolverStateT e m a
-> (GQLError -> ResolverStateT e m a) -> ResolverStateT e m a
forall e (m :: * -> *) a.
MonadError e m =>
m a -> (e -> m a) -> m a
catchError ResolverStateT e m a
r (Resolver 'OPERATION_MUTATION e m a -> ResolverStateT e m a
forall event (m :: * -> *) value.
Resolver 'OPERATION_MUTATION event m value
-> ResolverStateT event m value
runResolverM (Resolver 'OPERATION_MUTATION e m a -> ResolverStateT e m a)
-> (GQLError -> Resolver 'OPERATION_MUTATION e m a)
-> GQLError
-> ResolverStateT e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GQLError -> Resolver o e m a
GQLError -> Resolver 'OPERATION_MUTATION e m a
f)
  catchError (ResolverS ResolverStateT () m (SubEventRes e m a)
r) GQLError -> Resolver o e m a
f = ResolverStateT () m (SubEventRes e m a)
-> Resolver 'OPERATION_SUBSCRIPTION e m a
forall (m :: * -> *) event value.
ResolverStateT () m (SubEventRes event m value)
-> Resolver 'OPERATION_SUBSCRIPTION event m value
ResolverS (ResolverStateT () m (SubEventRes e m a)
 -> Resolver 'OPERATION_SUBSCRIPTION e m a)
-> ResolverStateT () m (SubEventRes e m a)
-> Resolver 'OPERATION_SUBSCRIPTION e m a
forall a b. (a -> b) -> a -> b
$ ResolverStateT () m (SubEventRes e m a)
-> (GQLError -> ResolverStateT () m (SubEventRes e m a))
-> ResolverStateT () m (SubEventRes e m a)
forall a.
ResolverStateT () m a
-> (GQLError -> ResolverStateT () m a) -> ResolverStateT () m a
forall e (m :: * -> *) a.
MonadError e m =>
m a -> (e -> m a) -> m a
catchError ResolverStateT () m (SubEventRes e m a)
r (Resolver 'OPERATION_SUBSCRIPTION e m a
-> ResolverStateT () m (SubEventRes e m a)
forall (m :: * -> *) event value.
Resolver 'OPERATION_SUBSCRIPTION event m value
-> ResolverStateT () m (SubEventRes event m value)
runResolverS (Resolver 'OPERATION_SUBSCRIPTION e m a
 -> ResolverStateT () m (SubEventRes e m a))
-> (GQLError -> Resolver 'OPERATION_SUBSCRIPTION e m a)
-> GQLError
-> ResolverStateT () m (SubEventRes e m a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GQLError -> Resolver o e m a
GQLError -> Resolver 'OPERATION_SUBSCRIPTION e m a
f)

instance (Monad m, LiftOperation o) => MonadFail (Resolver o e m) where
  fail :: forall a. String -> Resolver o e m a
fail = GQLError -> Resolver o e m a
forall a. GQLError -> Resolver o e m a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (GQLError -> Resolver o e m a)
-> (String -> GQLError) -> String -> Resolver o e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> GQLError
forall a. Msg a => a -> GQLError
msg

-- PushEvents
instance (Monad m) => PushEvents e (Resolver MUTATION e m) where
  pushEvents :: [e] -> Resolver 'OPERATION_MUTATION e m ()
pushEvents = ResolverStateT e m () -> Resolver 'OPERATION_MUTATION e m ()
forall (o :: OperationType) (m :: * -> *) e a.
(LiftOperation o, Monad m) =>
ResolverStateT e m a -> Resolver o e m a
forall (m :: * -> *) e a.
Monad m =>
ResolverStateT e m a -> Resolver 'OPERATION_MUTATION e m a
packResolver (ResolverStateT e m () -> Resolver 'OPERATION_MUTATION e m ())
-> ([e] -> ResolverStateT e m ())
-> [e]
-> Resolver 'OPERATION_MUTATION e m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [e] -> ResolverStateT e m ()
forall e (m :: * -> *). PushEvents e m => [e] -> m ()
pushEvents

instance (Monad m, Semigroup a, LiftOperation o) => Semigroup (Resolver o e m a) where
  Resolver o e m a
x <> :: Resolver o e m a -> Resolver o e m a -> Resolver o e m a
<> Resolver o e m a
y = (a -> a -> a) -> Resolver o e m a -> Resolver o e m (a -> a)
forall a b. (a -> b) -> Resolver o e m a -> Resolver o e m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a -> a
forall a. Semigroup a => a -> a -> a
(<>) Resolver o e m a
x Resolver o e m (a -> a) -> Resolver o e m a -> Resolver o e m a
forall a b.
Resolver o e m (a -> b) -> Resolver o e m a -> Resolver o e m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Resolver o e m a
y

instance (LiftOperation o, Monad m) => MonadReader ResolverContext (Resolver o e m) where
  ask :: Resolver o e m ResolverContext
ask = ResolverStateT e m ResolverContext
-> Resolver o e m ResolverContext
forall (o :: OperationType) (m :: * -> *) e a.
(LiftOperation o, Monad m) =>
ResolverStateT e m a -> Resolver o e m a
forall (m :: * -> *) e a.
Monad m =>
ResolverStateT e m a -> Resolver o e m a
packResolver ResolverStateT e m ResolverContext
forall r (m :: * -> *). MonadReader r m => m r
ask
  local :: forall a.
(ResolverContext -> ResolverContext)
-> Resolver o e m a -> Resolver o e m a
local ResolverContext -> ResolverContext
f (ResolverQ ResolverStateT () m a
res) = ResolverStateT () m a -> Resolver 'OPERATION_QUERY e m a
forall (m :: * -> *) value event.
ResolverStateT () m value
-> Resolver 'OPERATION_QUERY event m value
ResolverQ ((ResolverContext -> ResolverContext)
-> ResolverStateT () m a -> ResolverStateT () m a
forall a.
(ResolverContext -> ResolverContext)
-> ResolverStateT () m a -> ResolverStateT () m a
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local ResolverContext -> ResolverContext
f ResolverStateT () m a
res)
  local ResolverContext -> ResolverContext
f (ResolverM ResolverStateT e m a
res) = ResolverStateT e m a -> Resolver 'OPERATION_MUTATION e m a
forall event (m :: * -> *) value.
ResolverStateT event m value
-> Resolver 'OPERATION_MUTATION event m value
ResolverM ((ResolverContext -> ResolverContext)
-> ResolverStateT e m a -> ResolverStateT e m a
forall a.
(ResolverContext -> ResolverContext)
-> ResolverStateT e m a -> ResolverStateT e m a
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local ResolverContext -> ResolverContext
f ResolverStateT e m a
res)
  local ResolverContext -> ResolverContext
f (ResolverS ResolverStateT () m (SubEventRes e m a)
resM) = ResolverStateT () m (SubEventRes e m a)
-> Resolver 'OPERATION_SUBSCRIPTION e m a
forall (m :: * -> *) event value.
ResolverStateT () m (SubEventRes event m value)
-> Resolver 'OPERATION_SUBSCRIPTION event m value
ResolverS (ResolverStateT () m (SubEventRes e m a)
 -> Resolver 'OPERATION_SUBSCRIPTION e m a)
-> ResolverStateT () m (SubEventRes e m a)
-> Resolver 'OPERATION_SUBSCRIPTION e m a
forall a b. (a -> b) -> a -> b
$ (ResolverStateT () m a -> ResolverStateT () m a)
-> SubEventRes e m a -> SubEventRes e m a
forall (m :: * -> *) a (n :: * -> *) b r.
(m a -> n b) -> ReaderT r m a -> ReaderT r n b
mapReaderT ((ResolverContext -> ResolverContext)
-> ResolverStateT () m a -> ResolverStateT () m a
forall a.
(ResolverContext -> ResolverContext)
-> ResolverStateT () m a -> ResolverStateT () m a
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local ResolverContext -> ResolverContext
f) (SubEventRes e m a -> SubEventRes e m a)
-> ResolverStateT () m (SubEventRes e m a)
-> ResolverStateT () m (SubEventRes e m a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ResolverStateT () m (SubEventRes e m a)
resM

class LiftOperation (o :: OperationType) where
  packResolver :: Monad m => ResolverStateT e m a -> Resolver o e m a

instance LiftOperation QUERY where
  packResolver :: forall (m :: * -> *) e a.
Monad m =>
ResolverStateT e m a -> Resolver 'OPERATION_QUERY e m a
packResolver = ResolverStateT () m a -> Resolver 'OPERATION_QUERY e m a
forall (m :: * -> *) value event.
ResolverStateT () m value
-> Resolver 'OPERATION_QUERY event m value
ResolverQ (ResolverStateT () m a -> Resolver 'OPERATION_QUERY e m a)
-> (ResolverStateT e m a -> ResolverStateT () m a)
-> ResolverStateT e m a
-> Resolver 'OPERATION_QUERY e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ResolverStateT e m a -> ResolverStateT () m a
forall (m :: * -> *) e a e'.
Functor m =>
ResolverStateT e m a -> ResolverStateT e' m a
clearStateResolverEvents

instance LiftOperation MUTATION where
  packResolver :: forall (m :: * -> *) e a.
Monad m =>
ResolverStateT e m a -> Resolver 'OPERATION_MUTATION e m a
packResolver = ResolverStateT e m a -> Resolver 'OPERATION_MUTATION e m a
forall event (m :: * -> *) value.
ResolverStateT event m value
-> Resolver 'OPERATION_MUTATION event m value
ResolverM

instance LiftOperation SUBSCRIPTION where
  packResolver :: forall (m :: * -> *) e a.
Monad m =>
ResolverStateT e m a -> Resolver 'OPERATION_SUBSCRIPTION e m a
packResolver = ResolverStateT () m (SubEventRes e m a)
-> Resolver 'OPERATION_SUBSCRIPTION e m a
forall (m :: * -> *) event value.
ResolverStateT () m (SubEventRes event m value)
-> Resolver 'OPERATION_SUBSCRIPTION event m value
ResolverS (ResolverStateT () m (SubEventRes e m a)
 -> Resolver 'OPERATION_SUBSCRIPTION e m a)
-> (ResolverStateT e m a
    -> ResolverStateT () m (SubEventRes e m a))
-> ResolverStateT e m a
-> Resolver 'OPERATION_SUBSCRIPTION e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SubEventRes e m a -> ResolverStateT () m (SubEventRes e m a)
forall a. a -> ResolverStateT () m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (SubEventRes e m a -> ResolverStateT () m (SubEventRes e m a))
-> (ResolverStateT e m a -> SubEventRes e m a)
-> ResolverStateT e m a
-> ResolverStateT () m (SubEventRes e m a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ResolverStateT () m a -> SubEventRes e m a
forall (m :: * -> *) a. Monad m => m a -> ReaderT e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (ResolverStateT () m a -> SubEventRes e m a)
-> (ResolverStateT e m a -> ResolverStateT () m a)
-> ResolverStateT e m a
-> SubEventRes e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ResolverStateT e m a -> ResolverStateT () m a
forall (m :: * -> *) e a e'.
Functor m =>
ResolverStateT e m a -> ResolverStateT e' m a
clearStateResolverEvents

toEventResolver :: Monad m => ResolverContext -> SubEventRes event m ValidValue -> (event -> m GQLResponse)
toEventResolver :: forall (m :: * -> *) event.
Monad m =>
ResolverContext
-> SubEventRes event m ValidValue -> event -> m GQLResponse
toEventResolver ResolverContext
sel (ReaderT event -> ResolverStateT () m ValidValue
subRes) event
event = Result GQLError ValidValue -> GQLResponse
renderResponse (Result GQLError ValidValue -> GQLResponse)
-> m (Result GQLError ValidValue) -> m GQLResponse
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ResolverStateT () m ValidValue
-> ResolverContext -> m (Result GQLError ValidValue)
forall (m :: * -> *) e a.
Functor m =>
ResolverStateT e m a -> ResolverContext -> m (Result GQLError a)
runResolverStateValueM (event -> ResolverStateT () m ValidValue
subRes event
event) ResolverContext
sel

subscriptionEvents ::
  ResolverContext ->
  Maybe (Selection VALID -> ResolverState (Channel e)) ->
  (e -> m GQLResponse) ->
  GQLResult (ResponseEvent e m)
subscriptionEvents :: forall e (m :: * -> *).
ResolverContext
-> Maybe (Selection VALID -> ResolverState (Channel e))
-> (e -> m GQLResponse)
-> GQLResult (ResponseEvent e m)
subscriptionEvents ctx :: ResolverContext
ctx@ResolverContext {Selection VALID
currentSelection :: ResolverContext -> Selection VALID
currentSelection :: Selection VALID
currentSelection} (Just Selection VALID -> ResolverState (Channel e)
channelGenerator) e -> m GQLResponse
res =
  ResolverState (ResponseEvent e m)
-> ResolverContext -> GQLResult (ResponseEvent e m)
forall a. ResolverState a -> ResolverContext -> GQLResult a
runResolverState ResolverState (ResponseEvent e m)
handle ResolverContext
ctx
  where
    handle :: ResolverState (ResponseEvent e m)
handle = do
      Channel e
channel <- Selection VALID -> ResolverState (Channel e)
channelGenerator Selection VALID
currentSelection
      ResponseEvent e m -> ResolverState (ResponseEvent e m)
forall a. a -> ResolverStateT () Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ResponseEvent e m -> ResolverState (ResponseEvent e m))
-> ResponseEvent e m -> ResolverState (ResponseEvent e m)
forall a b. (a -> b) -> a -> b
$ Channel e -> (e -> m GQLResponse) -> ResponseEvent e m
forall event (m :: * -> *).
Channel event -> (event -> m GQLResponse) -> ResponseEvent event m
Subscribe Channel e
channel e -> m GQLResponse
res
subscriptionEvents ResolverContext
ctx Maybe (Selection VALID -> ResolverState (Channel e))
Nothing e -> m GQLResponse
_ = GQLError -> GQLResult (ResponseEvent e m)
forall a. GQLError -> Result GQLError a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (GQLError -> GQLResult (ResponseEvent e m))
-> GQLError -> GQLResult (ResponseEvent e m)
forall a b. (a -> b) -> a -> b
$ ResolverContext -> GQLError -> GQLError
resolverFailureMessage ResolverContext
ctx GQLError
"channel Resolver is not defined"