aboutsummaryrefslogtreecommitdiff
path: root/src/Language/GraphQL/Execute.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Language/GraphQL/Execute.hs')
-rw-r--r--src/Language/GraphQL/Execute.hs70
1 files changed, 31 insertions, 39 deletions
diff --git a/src/Language/GraphQL/Execute.hs b/src/Language/GraphQL/Execute.hs
index 45bace0..2b615f4 100644
--- a/src/Language/GraphQL/Execute.hs
+++ b/src/Language/GraphQL/Execute.hs
@@ -1,71 +1,63 @@
+{-# LANGUAGE OverloadedStrings #-}
+
-- | This module provides functions to execute a @GraphQL@ request.
module Language.GraphQL.Execute
( execute
- , executeWithName
+ , module Language.GraphQL.Execute.Coerce
) where
-import qualified Data.Aeson as Aeson
+import Control.Monad.Catch (MonadCatch)
import Data.HashMap.Strict (HashMap)
-import qualified Data.HashMap.Strict as HashMap
import Data.Sequence (Seq(..))
import Data.Text (Text)
import Language.GraphQL.AST.Document (Document, Name)
import Language.GraphQL.Execute.Coerce
import Language.GraphQL.Execute.Execution
import qualified Language.GraphQL.Execute.Transform as Transform
+import qualified Language.GraphQL.Execute.Subscribe as Subscribe
import Language.GraphQL.Error
import qualified Language.GraphQL.Type.Definition as Definition
import qualified Language.GraphQL.Type.Out as Out
import Language.GraphQL.Type.Schema
-- | The substitution is applied to the document, and the resolvers are applied
--- to the resulting fields.
---
--- Returns the result of the query against the schema wrapped in a /data/
--- field, or errors wrapped in an /errors/ field.
-execute :: (Monad m, VariableValue a)
- => Schema m -- ^ Resolvers.
- -> HashMap.HashMap Name a -- ^ Variable substitution function.
- -> Document -- @GraphQL@ document.
- -> m Aeson.Value
-execute schema = executeRequest schema Nothing
-
--- | The substitution is applied to the document, and the resolvers are applied
-- to the resulting fields. The operation name can be used if the document
-- defines multiple root operations.
--
-- Returns the result of the query against the schema wrapped in a /data/
-- field, or errors wrapped in an /errors/ field.
-executeWithName :: (Monad m, VariableValue a)
- => Schema m -- ^ Resolvers
- -> Text -- ^ Operation name.
- -> HashMap.HashMap Name a -- ^ Variable substitution function.
- -> Document -- ^ @GraphQL@ Document.
- -> m Aeson.Value
-executeWithName schema operationName =
- executeRequest schema (Just operationName)
-
-executeRequest :: (Monad m, VariableValue a)
- => Schema m
- -> Maybe Text
- -> HashMap.HashMap Name a
- -> Document
- -> m Aeson.Value
-executeRequest schema operationName subs document =
+execute :: (MonadCatch m, VariableValue a, Serialize b)
+ => Schema m -- ^ Resolvers.
+ -> Maybe Text -- ^ Operation name.
+ -> HashMap Name a -- ^ Variable substitution function.
+ -> Document -- @GraphQL@ document.
+ -> m (Either (ResponseEventStream m b) (Response b))
+execute schema operationName subs document =
case Transform.document schema operationName subs document of
- Left queryError -> pure $ singleError $ Transform.queryError queryError
- Right (Transform.Document types' rootObjectType operation)
- | (Transform.Query _ fields) <- operation ->
- executeOperation types' rootObjectType fields
- | (Transform.Mutation _ fields) <- operation ->
- executeOperation types' rootObjectType fields
+ Left queryError -> pure
+ $ Right
+ $ singleError
+ $ Transform.queryError queryError
+ Right transformed -> executeRequest transformed
+
+executeRequest :: (MonadCatch m, Serialize a)
+ => Transform.Document m
+ -> m (Either (ResponseEventStream m a) (Response a))
+executeRequest (Transform.Document types' rootObjectType operation)
+ | (Transform.Query _ fields) <- operation =
+ Right <$> executeOperation types' rootObjectType fields
+ | (Transform.Mutation _ fields) <- operation =
+ Right <$> executeOperation types' rootObjectType fields
+ | (Transform.Subscription _ fields) <- operation
+ = either (Right . singleError) Left
+ <$> Subscribe.subscribe types' rootObjectType fields
-- This is actually executeMutation, but we don't distinguish between queries
-- and mutations yet.
-executeOperation :: Monad m
+executeOperation :: (MonadCatch m, Serialize a)
=> HashMap Name (Type m)
-> Out.ObjectType m
-> Seq (Transform.Selection m)
- -> m Aeson.Value
+ -> m (Response a)
executeOperation types' objectType fields =
runCollectErrs types' $ executeSelectionSet Definition.Null objectType fields