From f2bd18c883ff627814d4ab728b6a7d75006be734 Mon Sep 17 00:00:00 2001 From: Jonathon Hill Date: Tue, 6 Feb 2024 10:03:36 -0500 Subject: [PATCH] feat: add support for argument definition directives --- src/DirectiveResolver.php | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/src/DirectiveResolver.php b/src/DirectiveResolver.php index 596abb9..eeec8ae 100644 --- a/src/DirectiveResolver.php +++ b/src/DirectiveResolver.php @@ -47,21 +47,42 @@ public function __construct($originalResolver = null) */ public function __invoke($root, array $args, $context, ResolveInfo $info) { + // Execute ARGUMENT_DEFINITION directives pre-resolve + foreach ($info->fieldDefinition->args as $argDefinition) { + if (!$argDefinition->astNode) { + continue; + } + $argDirectives = $this->readDirectives($argDefinition->astNode); + foreach ($argDirectives as $directiveName => $directiveArgs) { + $argName = $argDefinition->name; + if (array_key_exists($directiveName, $this->handlers)) { + $directiveHandler = $this->handlers[$directiveName]; + if (is_callable($directiveHandler)) { + /** @var NamedType&callable $directiveHandler */ + $this->logger->debug('Executing @' . $directiveName . ' (' . get_class($directiveHandler) . ') on ' . $argName); + $args[$argName] = $directiveHandler($args[$argName], $directiveArgs, $context, $info); + } else { + $this->logger->error('Found @' . $directiveName . ' directive on ' . $argName . ' but handler is not callable'); + } + } else { + $this->logger->warning('Found @' . $directiveName . ' directive on ' . $argName . ' but no handler is registered'); + } + } + } + if (is_callable($this->originalResolver)) { $root = ($this->originalResolver)($root, $args, $context, $info); } - $directives = []; - + // Execute FIELD_DEFINITION directives post-resolve + $fieldDirectives = []; if ($info->fieldDefinition->astNode) { - $directives = array_merge($directives, $this->readDirectives($info->fieldDefinition->astNode)); + $fieldDirectives = array_merge($fieldDirectives, $this->readDirectives($info->fieldDefinition->astNode)); } - if ($info->fieldNodes[0]) { - $directives = array_merge($directives, $this->readDirectives($info->fieldNodes[0])); + $fieldDirectives = array_merge($fieldDirectives, $this->readDirectives($info->fieldNodes[0])); } - - foreach ($directives as $directiveName => $directiveArgs) { + foreach ($fieldDirectives as $directiveName => $directiveArgs) { if (array_key_exists($directiveName, $this->handlers)) { $directiveHandler = $this->handlers[$directiveName]; if (is_callable($directiveHandler)) {