summaryrefslogtreecommitdiff
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.hs102
1 files changed, 3 insertions, 99 deletions
diff --git a/src/Language/GraphQL/Execute.hs b/src/Language/GraphQL/Execute.hs
index e21d5de..7513b6e 100644
--- a/src/Language/GraphQL/Execute.hs
+++ b/src/Language/GraphQL/Execute.hs
@@ -8,11 +8,8 @@ module Language.GraphQL.Execute
) where
import qualified Data.Aeson as Aeson
-import Data.Foldable (find)
import qualified Data.HashMap.Strict as HashMap
-import Data.List.NonEmpty (NonEmpty(..))
import Data.Text (Text)
-import qualified Data.Text as Text
import Language.GraphQL.AST.Document
import qualified Language.GraphQL.AST.Core as AST.Core
import Language.GraphQL.Execute.Coerce
@@ -22,18 +19,6 @@ import qualified Language.GraphQL.Schema as Schema
import qualified Language.GraphQL.Type.Definition as Definition
import Language.GraphQL.Type.Schema
--- | Query error types.
-data QueryError
- = OperationNotFound Text
- | OperationNameRequired
- | CoercionError
-
-queryError :: QueryError -> Text
-queryError (OperationNotFound operationName) = Text.unwords
- ["Operation", operationName, "couldn't be found in the document."]
-queryError OperationNameRequired = "Missing operation name."
-queryError CoercionError = "Coercion error."
-
-- | The substitution is applied to the document, and the resolvers are applied
-- to the resulting fields.
--
@@ -60,77 +45,6 @@ executeWithName :: (Monad m, VariableValue a)
-> m Aeson.Value
executeWithName schema operationName = document schema (Just operationName)
-getOperation
- :: Maybe Text
- -> Transform.Document
- -> Either QueryError Transform.OperationDefinition
-getOperation Nothing (Transform.Document (operation' :| []) _) = pure operation'
-getOperation Nothing _ = Left OperationNameRequired
-getOperation (Just operationName) (Transform.Document operations _)
- | Just operation' <- find matchingName operations = pure operation'
- | otherwise = Left $ OperationNotFound operationName
- where
- matchingName (Transform.OperationDefinition _ name _ _ _) =
- name == Just operationName
-
-lookupInputType
- :: Type
- -> HashMap.HashMap Name (Definition.TypeDefinition m)
- -> Maybe Definition.InputType
-lookupInputType (TypeNamed name) types =
- case HashMap.lookup name types of
- Just (Definition.ScalarTypeDefinition scalarType) ->
- Just $ Definition.ScalarInputType scalarType
- Just (Definition.EnumTypeDefinition enumType) ->
- Just $ Definition.EnumInputType enumType
- Just (Definition.InputObjectTypeDefinition objectType) ->
- Just $ Definition.ObjectInputType objectType
- _ -> Nothing
-lookupInputType (TypeList list) types
- = Definition.ListInputType
- <$> lookupInputType list types
-lookupInputType (TypeNonNull (NonNullTypeNamed nonNull)) types =
- case HashMap.lookup nonNull types of
- Just (Definition.ScalarTypeDefinition scalarType) ->
- Just $ Definition.NonNullScalarInputType scalarType
- Just (Definition.EnumTypeDefinition enumType) ->
- Just $ Definition.NonNullEnumInputType enumType
- Just (Definition.InputObjectTypeDefinition objectType) ->
- Just $ Definition.NonNullObjectInputType objectType
- _ -> Nothing
-lookupInputType (TypeNonNull (NonNullTypeList nonNull)) types
- = Definition.NonNullListInputType
- <$> lookupInputType nonNull types
-
-coerceVariableValues :: (Monad m, VariableValue a)
- => Schema m
- -> Transform.OperationDefinition
- -> HashMap.HashMap Name a
- -> Either QueryError Schema.Subs
-coerceVariableValues schema (Transform.OperationDefinition _ _ variables _ _) values =
- let referencedTypes = collectReferencedTypes schema
- in maybe (Left CoercionError) Right
- $ foldr (coerceValue referencedTypes) (Just HashMap.empty) variables
- where
- coerceValue referencedTypes variableDefinition coercedValues = do
- let VariableDefinition variableName variableTypeName _defaultValue =
- variableDefinition
- variableType <- lookupInputType variableTypeName referencedTypes
- value <- HashMap.lookup variableName values
- coercedValue <- coerceVariableValue variableType value
- HashMap.insert variableName coercedValue <$> coercedValues
-
-executeRequest :: (Monad m, VariableValue a)
- => Schema m
- -> Maybe Text
- -> HashMap.HashMap Name a
- -> Transform.Document
- -> Either QueryError (Transform.OperationDefinition, Schema.Subs)
-executeRequest schema operationName subs document' = do
- operation' <- getOperation operationName document'
- coercedValues <- coerceVariableValues schema operation' subs
- pure (operation', coercedValues)
-
document :: (Monad m, VariableValue a)
=> Schema m
-> Maybe Text
@@ -138,19 +52,9 @@ document :: (Monad m, VariableValue a)
-> Document
-> m Aeson.Value
document schema operationName subs document' =
- case Transform.document document' of
- Just transformed -> executeRequest' transformed
- Nothing -> pure $ singleError
- "The document doesn't contain any executable operations."
- where
- transformOperation fragmentTable operation' subs' =
- case Transform.operation fragmentTable subs' operation' of
- Just operationResult -> operation schema operationResult
- Nothing -> pure $ singleError "Schema transformation error."
- executeRequest' transformed@(Transform.Document _ fragmentTable) =
- case executeRequest schema operationName subs transformed of
- Right (operation', subs') -> transformOperation fragmentTable operation' subs'
- Left error' -> pure $ singleError $ queryError error'
+ case Transform.document schema operationName subs document' of
+ Left queryError -> pure $ singleError $ Transform.queryError queryError
+ Right (Transform.Document op _) -> operation schema op
operation :: Monad m
=> Schema m