summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2021-08-17 10:38:14 +0200
committerEugen Wissner <belka@caraus.de>2021-08-31 17:30:04 +0200
commitf527b61a3dcfe348001afce291f1b19fd8e37811 (patch)
tree92fab765cf5fd8de9f3b9be1475c37ae80e8d4e1
parent38ec439e9f50f4858c36d5584b8b610d6ec39eeb (diff)
downloadgraphql-f527b61a3dcfe348001afce291f1b19fd8e37811.tar.gz
Stub request execution
-rw-r--r--src/Language/GraphQL/Executor.hs65
1 files changed, 64 insertions, 1 deletions
diff --git a/src/Language/GraphQL/Executor.hs b/src/Language/GraphQL/Executor.hs
index 45bf1cb..e60ae4f 100644
--- a/src/Language/GraphQL/Executor.hs
+++ b/src/Language/GraphQL/Executor.hs
@@ -2,7 +2,9 @@
v. 2.0. If a copy of the MPL was not distributed with this file, You can
obtain one at https://mozilla.org/MPL/2.0/. -}
+{-# LANGUAGE ExplicitForAll #-}
{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE RecordWildCards #-}
module Language.GraphQL.Executor
( Error(..)
@@ -10,14 +12,20 @@ module Language.GraphQL.Executor
, QueryError(..)
, Response(..)
, Segment(..)
+ , coerceVariableValues
, executeRequest
) where
import qualified Language.GraphQL.AST.Document as Full
import qualified Data.Aeson as Aeson
import Data.Foldable (find)
+import Data.HashMap.Strict (HashMap)
+import qualified Data.HashMap.Strict as HashMap
import qualified Data.Text as Text
+import qualified Language.GraphQL.Execute.Coerce as Coerce
+import qualified Language.GraphQL.Type as Type
import qualified Language.GraphQL.Type.Internal as Type.Internal
+import qualified Language.GraphQL.Type.Schema as Schema
data Segment = Segment String | Index Int
@@ -35,11 +43,13 @@ data Response = Response
data QueryError
= OperationNameRequired
| OperationNotFound String
+ | CoercionError
instance Show QueryError where
show OperationNameRequired = "Operation name is required."
show (OperationNotFound operationName) =
concat ["Operation \"", operationName, "\" not found."]
+ show CoercionError = "Coercion error."
respondWithQueryError :: QueryError -> Response
respondWithQueryError queryError
@@ -82,7 +92,9 @@ executeRequest _schema sourceDocument operationName _variableValues _initialValu
operation = getOperation transformedDocument operationName
in case operation of
Left queryError -> pure $ respondWithQueryError queryError
- Right _ -> pure $ Response mempty mempty
+ Right (Operation Full.Query _ _ _ _) -> executeQuery
+ Right (Operation Full.Mutation _ _ _ _) -> executeMutation
+ Right (Operation Full.Subscription _ _ _ _) -> subscribe
getOperation :: [Operation] -> Maybe String -> Either QueryError Operation
getOperation [operation] Nothing = Right operation
@@ -94,3 +106,54 @@ getOperation operations (Just givenOperationName)
givenOperationName == operationName
findOperationByName _ = False
getOperation _ _ = Left OperationNameRequired
+
+executeQuery :: IO Response
+executeQuery = pure $ Response mempty mempty
+
+executeMutation :: IO Response
+executeMutation = pure $ Response mempty mempty
+
+subscribe :: IO Response
+subscribe = pure $ Response mempty mempty
+
+coerceVariableValues :: Coerce.VariableValue a
+ => forall m
+ . HashMap Full.Name (Schema.Type m)
+ -> Operation
+ -> HashMap Full.Name a
+ -> Either QueryError Type.Subs
+coerceVariableValues types operationDefinition' variableValues =
+ let Operation _ _ variableDefinitions _ _ = operationDefinition'
+ in maybe (Left CoercionError) Right
+ $ foldr forEach (Just HashMap.empty) variableDefinitions
+ where
+ forEach variableDefinition coercedValues = do
+ let Full.VariableDefinition variableName variableTypeName defaultValue _ =
+ variableDefinition
+ let defaultValue' = constValue . Full.node <$> defaultValue
+ variableType <- Type.Internal.lookupInputType variableTypeName types
+
+ Coerce.matchFieldValues
+ coerceVariableValue'
+ variableValues
+ variableName
+ variableType
+ defaultValue'
+ coercedValues
+ coerceVariableValue' variableType value'
+ = Coerce.coerceVariableValue variableType value'
+ >>= Coerce.coerceInputLiteral variableType
+
+constValue :: Full.ConstValue -> Type.Value
+constValue (Full.ConstInt i) = Type.Int i
+constValue (Full.ConstFloat f) = Type.Float f
+constValue (Full.ConstString x) = Type.String x
+constValue (Full.ConstBoolean b) = Type.Boolean b
+constValue Full.ConstNull = Type.Null
+constValue (Full.ConstEnum e) = Type.Enum e
+constValue (Full.ConstList list) = Type.List $ constValue . Full.node <$> list
+constValue (Full.ConstObject o) =
+ Type.Object $ HashMap.fromList $ constObjectField <$> o
+ where
+ constObjectField Full.ObjectField{value = value', ..} =
+ (name, constValue $ Full.node value')