2019-08-30 07:26:04 +02:00
|
|
|
-- | This module provides functions to execute a @GraphQL@ request.
|
2019-07-14 05:58:05 +02:00
|
|
|
module Language.GraphQL.Execute
|
|
|
|
( execute
|
2019-07-25 07:37:36 +02:00
|
|
|
, executeWithName
|
2019-07-14 05:58:05 +02:00
|
|
|
) where
|
2015-10-17 13:19:00 +02:00
|
|
|
|
2019-07-25 07:37:36 +02:00
|
|
|
import qualified Data.Aeson as Aeson
|
2020-05-27 23:18:35 +02:00
|
|
|
import Data.HashMap.Strict (HashMap)
|
2020-05-21 10:20:59 +02:00
|
|
|
import qualified Data.HashMap.Strict as HashMap
|
2020-05-26 11:13:55 +02:00
|
|
|
import Data.Sequence (Seq(..))
|
2019-07-25 07:37:36 +02:00
|
|
|
import Data.Text (Text)
|
2020-05-27 23:18:35 +02:00
|
|
|
import Language.GraphQL.AST.Document (Document, Name)
|
2020-05-21 10:20:59 +02:00
|
|
|
import Language.GraphQL.Execute.Coerce
|
2019-12-07 09:46:00 +01:00
|
|
|
import qualified Language.GraphQL.Execute.Transform as Transform
|
2019-07-07 06:31:53 +02:00
|
|
|
import Language.GraphQL.Error
|
2020-05-27 23:18:35 +02:00
|
|
|
import Language.GraphQL.Type.Definition
|
2019-07-07 06:31:53 +02:00
|
|
|
import qualified Language.GraphQL.Schema as Schema
|
2020-05-25 07:41:21 +02:00
|
|
|
import qualified Language.GraphQL.Type.Out as Out
|
2020-05-14 09:17:14 +02:00
|
|
|
import Language.GraphQL.Type.Schema
|
|
|
|
|
2019-08-30 07:26:04 +02:00
|
|
|
-- | The substitution is applied to the document, and the resolvers are applied
|
|
|
|
-- to the resulting fields.
|
2016-03-15 14:02:34 +01:00
|
|
|
--
|
2019-08-30 07:26:04 +02:00
|
|
|
-- Returns the result of the query against the schema wrapped in a /data/
|
|
|
|
-- field, or errors wrapped in an /errors/ field.
|
2020-05-21 10:20:59 +02:00
|
|
|
execute :: (Monad m, VariableValue a)
|
2020-05-14 09:17:14 +02:00
|
|
|
=> Schema m -- ^ Resolvers.
|
2020-05-21 10:20:59 +02:00
|
|
|
-> HashMap.HashMap Name a -- ^ Variable substitution function.
|
2019-12-26 13:00:47 +01:00
|
|
|
-> Document -- @GraphQL@ document.
|
2019-07-25 07:37:36 +02:00
|
|
|
-> m Aeson.Value
|
2020-05-26 11:13:55 +02:00
|
|
|
execute schema = executeRequest schema Nothing
|
2019-07-25 07:37:36 +02:00
|
|
|
|
2019-08-30 07:26:04 +02:00
|
|
|
-- | 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.
|
2019-07-25 07:37:36 +02:00
|
|
|
--
|
2019-08-30 07:26:04 +02:00
|
|
|
-- Returns the result of the query against the schema wrapped in a /data/
|
|
|
|
-- field, or errors wrapped in an /errors/ field.
|
2020-05-21 10:20:59 +02:00
|
|
|
executeWithName :: (Monad m, VariableValue a)
|
2020-05-14 09:17:14 +02:00
|
|
|
=> Schema m -- ^ Resolvers
|
2019-08-30 07:26:04 +02:00
|
|
|
-> Text -- ^ Operation name.
|
2020-05-21 10:20:59 +02:00
|
|
|
-> HashMap.HashMap Name a -- ^ Variable substitution function.
|
2019-12-26 13:00:47 +01:00
|
|
|
-> Document -- ^ @GraphQL@ Document.
|
2019-07-25 07:37:36 +02:00
|
|
|
-> m Aeson.Value
|
2020-05-26 11:13:55 +02:00
|
|
|
executeWithName schema operationName =
|
|
|
|
executeRequest schema (Just operationName)
|
2017-01-29 16:53:15 +01:00
|
|
|
|
2020-05-26 11:13:55 +02:00
|
|
|
executeRequest :: (Monad m, VariableValue a)
|
2020-05-21 10:20:59 +02:00
|
|
|
=> Schema m
|
|
|
|
-> Maybe Text
|
|
|
|
-> HashMap.HashMap Name a
|
|
|
|
-> Document
|
2019-08-30 07:26:04 +02:00
|
|
|
-> m Aeson.Value
|
2020-05-26 11:13:55 +02:00
|
|
|
executeRequest schema operationName subs document =
|
|
|
|
case Transform.document schema operationName subs document of
|
2020-05-22 10:11:48 +02:00
|
|
|
Left queryError -> pure $ singleError $ Transform.queryError queryError
|
2020-05-27 23:18:35 +02:00
|
|
|
Right (Transform.Document types' rootObjectType operation)
|
|
|
|
| (Transform.Query _ fields) <- operation ->
|
|
|
|
executeOperation types' rootObjectType fields
|
|
|
|
| (Transform.Mutation _ fields) <- operation ->
|
|
|
|
executeOperation types' rootObjectType fields
|
2017-01-29 16:53:15 +01:00
|
|
|
|
2020-05-26 11:13:55 +02:00
|
|
|
-- This is actually executeMutation, but we don't distinguish between queries
|
|
|
|
-- and mutations yet.
|
|
|
|
executeOperation :: Monad m
|
2020-05-27 23:18:35 +02:00
|
|
|
=> HashMap Name (Type m)
|
|
|
|
-> Out.ObjectType m
|
|
|
|
-> Seq (Transform.Selection m)
|
2019-08-30 07:26:04 +02:00
|
|
|
-> m Aeson.Value
|
2020-05-27 23:18:35 +02:00
|
|
|
executeOperation types' objectType fields =
|
|
|
|
runCollectErrs types' $ Schema.resolve Null objectType fields
|