Astroport.ONE/venv/lib/python3.11/site-packages/graphql/validation/rules/scalar_leafs.py
2024-03-01 16:15:45 +01:00

42 lines
1.4 KiB
Python

from typing import Any
from ...error import GraphQLError
from ...language import FieldNode
from ...type import get_named_type, is_leaf_type
from . import ValidationRule
__all__ = ["ScalarLeafsRule"]
class ScalarLeafsRule(ValidationRule):
"""Scalar leafs
A GraphQL document is valid only if all leaf fields (fields without sub selections)
are of scalar or enum types.
"""
def enter_field(self, node: FieldNode, *_args: Any) -> None:
type_ = self.context.get_type()
if type_:
selection_set = node.selection_set
if is_leaf_type(get_named_type(type_)):
if selection_set:
field_name = node.name.value
self.report_error(
GraphQLError(
f"Field '{field_name}' must not have a selection"
f" since type '{type_}' has no subfields.",
selection_set,
)
)
elif not selection_set:
field_name = node.name.value
self.report_error(
GraphQLError(
f"Field '{field_name}' of type '{type_}'"
" must have a selection of subfields."
f" Did you mean '{field_name} {{ ... }}'?",
node,
)
)