diff options
| author | Eugen Wissner <belka@caraus.de> | 2020-05-22 10:11:48 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2020-05-22 10:11:48 +0200 |
| commit | 26cc53ce0678d48bf7d5550df65171e6bf5288d2 (patch) | |
| tree | 4b823c8d481463f2d2eb43beeea06310b2c51e5e /src/Language/GraphQL/Execute.hs | |
| parent | c3ecfece0358d79dd1da6efbe6ab83e63bf50f88 (diff) | |
| download | graphql-26cc53ce0678d48bf7d5550df65171e6bf5288d2.tar.gz | |
Reject variables as default values
Diffstat (limited to 'src/Language/GraphQL/Execute.hs')
| -rw-r--r-- | src/Language/GraphQL/Execute.hs | 102 |
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 |
