diff options
| author | Eugen Wissner <belka@caraus.de> | 2020-09-29 06:21:32 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2020-09-29 06:21:32 +0200 |
| commit | 466416d4b00ab48aaab36eea9623a8aaad366fa8 (patch) | |
| tree | 409d86ca6d6851b8b84f8e1099e076a5d0692682 /src/Language/GraphQL/Validate | |
| parent | 4602eb1df3a713989b155f0140ff8909eb0370cf (diff) | |
| download | graphql-466416d4b00ab48aaab36eea9623a8aaad366fa8.tar.gz | |
Validate directives are defined
Diffstat (limited to 'src/Language/GraphQL/Validate')
| -rw-r--r-- | src/Language/GraphQL/Validate/Rules.hs | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/Language/GraphQL/Validate/Rules.hs b/src/Language/GraphQL/Validate/Rules.hs index bd0b4ed..6e550f8 100644 --- a/src/Language/GraphQL/Validate/Rules.hs +++ b/src/Language/GraphQL/Validate/Rules.hs @@ -16,6 +16,7 @@ module Language.GraphQL.Validate.Rules , fragmentSpreadTypeExistenceRule , loneAnonymousOperationRule , knownArgumentNamesRule + , knownDirectiveNamesRule , noFragmentCyclesRule , noUndefinedVariablesRule , noUnusedFragmentsRule @@ -84,6 +85,7 @@ specifiedRules = -- Values , uniqueInputFieldNamesRule -- Directives. + , knownDirectiveNamesRule , uniqueDirectiveNamesRule -- Variables. , uniqueVariableNamesRule @@ -812,3 +814,27 @@ knownArgumentNamesRule = ArgumentsRule fieldRule directiveRule , Text.unpack directiveName , "\"." ] + +-- | GraphQL servers define what directives they support. For each usage of a +-- directive, the directive must be available on that server. +knownDirectiveNamesRule :: Rule m +knownDirectiveNamesRule = DirectivesRule $ \directives' -> do + definitions' <- asks directives + let directiveSet = HashSet.fromList $ fmap directiveName directives' + let definitionSet = HashSet.fromList $ HashMap.keys definitions' + let difference = HashSet.difference directiveSet definitionSet + let undefined' = filter (definitionFilter difference) directives' + lift $ Seq.fromList $ makeError <$> undefined' + where + definitionFilter difference = flip HashSet.member difference + . directiveName + directiveName (Directive directiveName' _ _) = directiveName' + makeError (Directive directiveName' _ location) = Error + { message = errorMessage directiveName' + , locations = [location] + } + errorMessage directiveName' = concat + [ "Unknown directive \"@" + , Text.unpack directiveName' + , "\"." + ] |
