graphql/src/Language/GraphQL/Execute.hs

78 lines
2.8 KiB
Haskell
Raw Normal View History

2017-02-10 22:40:08 +01:00
{-# LANGUAGE OverloadedStrings #-}
2020-05-14 09:17:14 +02:00
{-# LANGUAGE NamedFieldPuns #-}
-- | 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
2019-07-25 07:37:36 +02:00
import qualified Data.Aeson as Aeson
2020-05-21 10:20:59 +02:00
import qualified Data.HashMap.Strict as HashMap
import Data.Sequence (Seq(..))
2019-07-25 07:37:36 +02:00
import Data.Text (Text)
2019-12-26 13:00:47 +01:00
import Language.GraphQL.AST.Document
import qualified Language.GraphQL.AST.Core as AST.Core
2020-05-21 10:20:59 +02:00
import Language.GraphQL.Execute.Coerce
import qualified Language.GraphQL.Execute.Transform as Transform
import Language.GraphQL.Error
import qualified Language.GraphQL.Schema as Schema
import qualified Language.GraphQL.Type.Out as Out
2020-05-14 09:17:14 +02:00
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.
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
execute schema = executeRequest schema Nothing
2019-07-25 07:37:36 +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
--
-- 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
-> 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
executeWithName schema operationName =
executeRequest schema (Just operationName)
executeRequest :: (Monad m, VariableValue a)
2020-05-21 10:20:59 +02:00
=> Schema m
-> Maybe Text
-> HashMap.HashMap Name a
-> Document
-> m Aeson.Value
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
Right (Transform.Document rootObjectType operation)
| (AST.Core.Query _ fields) <- operation ->
executeOperation rootObjectType fields
| (AST.Core.Mutation _ fields) <- operation ->
executeOperation rootObjectType fields
-- This is actually executeMutation, but we don't distinguish between queries
-- and mutations yet.
executeOperation :: Monad m
=> Out.ObjectType m
-> Seq AST.Core.Selection
-> m Aeson.Value
executeOperation (Out.ObjectType _ _ _ objectFields) fields
= runCollectErrs
$ flip Schema.resolve fields
$ fmap getResolver
$ objectFields
where
getResolver (Out.Field _ _ _ resolver) = resolver