Automattic\WooCommerce\Vendor\GraphQL\Validator\Rules
ProvidedRequiredArgumentsOnDirectives::getASTVisitor
Method of the class: ProvidedRequiredArgumentsOnDirectives{}
No Hooks.
Returns
null. Nothing (null).
Usage
$ProvidedRequiredArgumentsOnDirectives = new ProvidedRequiredArgumentsOnDirectives(); $ProvidedRequiredArgumentsOnDirectives->getASTVisitor( $context ): array;
- $context(ValidationContext) (required)
- .
ProvidedRequiredArgumentsOnDirectives::getASTVisitor() ProvidedRequiredArgumentsOnDirectives::getASTVisitor code WC 10.9.4
public function getASTVisitor(ValidationContext $context): array
{
$requiredArgsMap = [];
$schema = $context->getSchema();
$definedDirectives = $schema === null
? Directive::getInternalDirectives()
: $schema->getDirectives();
foreach ($definedDirectives as $directive) {
$directiveArgs = [];
foreach ($directive->args as $arg) {
if ($arg->isRequired()) {
$directiveArgs[$arg->name] = $arg;
}
}
$requiredArgsMap[$directive->name] = $directiveArgs;
}
$astDefinition = $context->getDocument()->definitions;
foreach ($astDefinition as $def) {
if ($def instanceof DirectiveDefinitionNode) {
$arguments = $def->arguments;
$requiredArgs = [];
foreach ($arguments as $argument) {
if ($argument->type instanceof NonNullTypeNode && ! isset($argument->defaultValue)) {
$requiredArgs[$argument->name->value] = $argument;
}
}
$requiredArgsMap[$def->name->value] = $requiredArgs;
}
}
return [
NodeKind::DIRECTIVE => [
// Validate on leave to allow for deeper errors to appear first.
'leave' => static function (DirectiveNode $directiveNode) use ($requiredArgsMap, $context): ?string {
$directiveName = $directiveNode->name->value;
$requiredArgs = $requiredArgsMap[$directiveName] ?? null;
if ($requiredArgs === null || $requiredArgs === []) {
return null;
}
$argNodeMap = [];
foreach ($directiveNode->arguments as $arg) {
$argNodeMap[$arg->name->value] = $arg;
}
foreach ($requiredArgs as $argName => $arg) {
if (! isset($argNodeMap[$argName])) {
$argType = $arg instanceof Argument
? $arg->getType()->toString()
: Printer::doPrint($arg->type);
$context->reportError(
new Error(static::missingDirectiveArgMessage($directiveName, $argName, $argType), [$directiveNode])
);
}
}
return null;
},
],
];
}