forked from STI/Astroport.ONE
43 lines
1.4 KiB
Python
43 lines
1.4 KiB
Python
from typing import Any, Dict
|
|
|
|
from ...error import GraphQLError
|
|
from ...language import NameNode, OperationDefinitionNode, VisitorAction, SKIP
|
|
from . import ASTValidationContext, ASTValidationRule
|
|
|
|
__all__ = ["UniqueOperationNamesRule"]
|
|
|
|
|
|
class UniqueOperationNamesRule(ASTValidationRule):
|
|
"""Unique operation names
|
|
|
|
A GraphQL document is only valid if all defined operations have unique names.
|
|
|
|
See https://spec.graphql.org/draft/#sec-Operation-Name-Uniqueness
|
|
"""
|
|
|
|
def __init__(self, context: ASTValidationContext):
|
|
super().__init__(context)
|
|
self.known_operation_names: Dict[str, NameNode] = {}
|
|
|
|
def enter_operation_definition(
|
|
self, node: OperationDefinitionNode, *_args: Any
|
|
) -> VisitorAction:
|
|
operation_name = node.name
|
|
if operation_name:
|
|
known_operation_names = self.known_operation_names
|
|
if operation_name.value in known_operation_names:
|
|
self.report_error(
|
|
GraphQLError(
|
|
"There can be only one operation"
|
|
f" named '{operation_name.value}'.",
|
|
[known_operation_names[operation_name.value], operation_name],
|
|
)
|
|
)
|
|
else:
|
|
known_operation_names[operation_name.value] = operation_name
|
|
return SKIP
|
|
|
|
@staticmethod
|
|
def enter_fragment_definition(*_args: Any) -> VisitorAction:
|
|
return SKIP
|