42 lines
1.4 KiB
Python
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,
|
|
)
|
|
)
|