Automattic\WooCommerce\Vendor\GraphQL\Validator\Rules

OneOfInputObjectsRule::getVisitorpublicWC 1.0

Method of the class: OneOfInputObjectsRule{}

No Hooks.

Returns

null. Nothing (null).

Usage

$OneOfInputObjectsRule = new OneOfInputObjectsRule();
$OneOfInputObjectsRule->getVisitor( $context ): array;
$context(QueryValidationContext) (required)
.

OneOfInputObjectsRule::getVisitor() code WC 10.9.1

public function getVisitor(QueryValidationContext $context): array
{
    return [
        NodeKind::OBJECT => static function (ObjectValueNode $node) use ($context): void {
            $type = $context->getInputType();

            if ($type === null) {
                return;
            }

            $namedType = Type::getNamedType($type);
            if (! ($namedType instanceof InputObjectType)
                || ! $namedType->isOneOf()
            ) {
                return;
            }

            $providedFields = [];
            $nullFields = [];

            foreach ($node->fields as $fieldNode) {
                $fieldName = $fieldNode->name->value;
                $providedFields[] = $fieldName;

                // Check if the field value is explicitly null
                if ($fieldNode->value->kind === NodeKind::NULL) {
                    $nullFields[] = $fieldName;
                }
            }

            $fieldCount = count($providedFields);

            if ($fieldCount === 0) {
                $context->reportError(new Error(
                    static::oneOfInputObjectExpectedExactlyOneFieldMessage($namedType->name),
                    [$node]
                ));

                return;
            }

            if ($fieldCount > 1) {
                $context->reportError(new Error(
                    static::oneOfInputObjectExpectedExactlyOneFieldMessage($namedType->name, $fieldCount),
                    [$node]
                ));

                return;
            }

            // At this point, $fieldCount === 1
            if (count($nullFields) > 0) {
                // Exactly one field provided, but it's null
                $context->reportError(new Error(
                    static::oneOfInputObjectFieldValueMustNotBeNullMessage($namedType->name, $nullFields[0]),
                    [$node]
                ));
            }
        },
    ];
}