Validate directives are defined

This commit is contained in:
2020-09-29 06:21:32 +02:00
parent 4602eb1df3
commit 466416d4b0
6 changed files with 103 additions and 11 deletions

View File

@ -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'
, "\"."
]