Automattic\WooCommerce\Vendor\GraphQL\Validator\Rules

UniqueEnumValueNames::getSDLVisitorpublicWC 1.0

Method of the class: UniqueEnumValueNames{}

No Hooks.

Returns

null. Nothing (null).

Usage

$UniqueEnumValueNames = new UniqueEnumValueNames();
$UniqueEnumValueNames->getSDLVisitor( $context ): array;
$context(SDLValidationContext) (required)
.

UniqueEnumValueNames::getSDLVisitor() code WC 10.9.4

public function getSDLVisitor(SDLValidationContext $context): array
{
    /** @var array<string, array<string, EnumValueNode>> $knownValueNames */
    $knownValueNames = [];

    /**
     * @param EnumTypeDefinitionNode|EnumTypeExtensionNode $enum
     */
    $checkValueUniqueness = static function ($enum) use ($context, &$knownValueNames): VisitorOperation {
        $typeName = $enum->name->value;

        $schema = $context->getSchema();
        $existingType = $schema !== null
            ? $schema->getType($typeName)
            : null;

        $valueNodes = $enum->values;

        if (! isset($knownValueNames[$typeName])) {
            $knownValueNames[$typeName] = [];
        }

        $valueNames = &$knownValueNames[$typeName];

        foreach ($valueNodes as $valueDef) {
            $valueNameNode = $valueDef->name;
            $valueName = $valueNameNode->value;

            if ($existingType instanceof EnumType && $existingType->getValue($valueName) !== null) {
                $context->reportError(new Error(
                    "Enum value \"{$typeName}.{$valueName}\" already exists in the schema. It cannot also be defined in this type extension.",
                    $valueNameNode
                ));
            } elseif (isset($valueNames[$valueName])) {
                $context->reportError(new Error(
                    "Enum value \"{$typeName}.{$valueName}\" can only be defined once.",
                    [$valueNames[$valueName], $valueNameNode]
                ));
            } else {
                $valueNames[$valueName] = $valueNameNode;
            }
        }

        return Visitor::skipNode();
    };

    return [
        NodeKind::ENUM_TYPE_DEFINITION => $checkValueUniqueness,
        NodeKind::ENUM_TYPE_EXTENSION => $checkValueUniqueness,
    ];
}