Automattic\WooCommerce\Vendor\GraphQL\Validator\Rules

ProvidedRequiredArgumentsOnDirectives::getASTVisitorpublicWC 1.0

Method of the class: ProvidedRequiredArgumentsOnDirectives{}

No Hooks.

Returns

null. Nothing (null).

Usage

$ProvidedRequiredArgumentsOnDirectives = new ProvidedRequiredArgumentsOnDirectives();
$ProvidedRequiredArgumentsOnDirectives->getASTVisitor( $context ): array;
$context(ValidationContext) (required)
.

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;
            },
        ],
    ];
}