summaryrefslogtreecommitdiff
path: root/src/Language/GraphQL/Execute.hs
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2019-07-07 06:31:53 +0200
committerEugen Wissner <belka@caraus.de>2019-07-07 06:31:53 +0200
commit22d4a4e583d8075fc71cddc22566f41fc5a698dc (patch)
tree116b444d7b465aadf8a33a22fdd2a6db6994e7c0 /src/Language/GraphQL/Execute.hs
parent1431db7e634e5447375e1c598f4336f499384730 (diff)
downloadgraphql-22d4a4e583d8075fc71cddc22566f41fc5a698dc.tar.gz
Change the main namespace to Language.GraphQL
Diffstat (limited to 'src/Language/GraphQL/Execute.hs')
-rw-r--r--src/Language/GraphQL/Execute.hs38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/Language/GraphQL/Execute.hs b/src/Language/GraphQL/Execute.hs
new file mode 100644
index 0000000..eb53bba
--- /dev/null
+++ b/src/Language/GraphQL/Execute.hs
@@ -0,0 +1,38 @@
+{-# LANGUAGE OverloadedStrings #-}
+-- | This module provides the function to execute a @GraphQL@ request --
+-- according to a 'Schema'.
+module Language.GraphQL.Execute (execute) where
+
+import Control.Monad (MonadPlus(..))
+import qualified Data.List.NonEmpty as NE
+import Data.List.NonEmpty (NonEmpty((:|)))
+import qualified Data.Aeson as Aeson
+import qualified Language.GraphQL.AST as AST
+import qualified Language.GraphQL.AST.Core as AST.Core
+import qualified Language.GraphQL.AST.Transform as Transform
+import Language.GraphQL.Error
+import Language.GraphQL.Schema (Schema)
+import qualified Language.GraphQL.Schema as Schema
+
+-- | Takes a 'Schema', a variable substitution function ('Schema.Subs'), and a
+-- @GraphQL@ 'document'. The substitution is applied to the document using
+-- 'rootFields', and the 'Schema''s 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
+ :: (MonadPlus m)
+ => Schema m -> Schema.Subs -> AST.Document -> m Aeson.Value
+execute schema subs doc = do
+ coreDocument <- maybe mzero pure (Transform.document subs doc)
+ document schema coreDocument
+
+document :: MonadPlus m => Schema m -> AST.Core.Document -> m Aeson.Value
+document schema (op :| []) = operation schema op
+document _ _ = error "Multiple operations not supported yet"
+
+operation :: MonadPlus m => Schema m -> AST.Core.Operation -> m Aeson.Value
+operation schema (AST.Core.Query flds)
+ = runCollectErrs (Schema.resolve (NE.toList schema) (NE.toList flds))
+operation schema (AST.Core.Mutation flds)
+ = runCollectErrs (Schema.resolve (NE.toList schema) (NE.toList flds))