forked from STI/Astroport.ONE
40 lines
1.3 KiB
Python
40 lines
1.3 KiB
Python
|
from typing import Any
|
||
|
|
||
|
from ...error import GraphQLError
|
||
|
from ...language import SchemaDefinitionNode
|
||
|
from . import SDLValidationRule, SDLValidationContext
|
||
|
|
||
|
__all__ = ["LoneSchemaDefinitionRule"]
|
||
|
|
||
|
|
||
|
class LoneSchemaDefinitionRule(SDLValidationRule):
|
||
|
"""Lone Schema definition
|
||
|
|
||
|
A GraphQL document is only valid if it contains only one schema definition.
|
||
|
"""
|
||
|
|
||
|
def __init__(self, context: SDLValidationContext):
|
||
|
super().__init__(context)
|
||
|
old_schema = context.schema
|
||
|
self.already_defined = old_schema and (
|
||
|
old_schema.ast_node
|
||
|
or old_schema.query_type
|
||
|
or old_schema.mutation_type
|
||
|
or old_schema.subscription_type
|
||
|
)
|
||
|
self.schema_definitions_count = 0
|
||
|
|
||
|
def enter_schema_definition(self, node: SchemaDefinitionNode, *_args: Any) -> None:
|
||
|
if self.already_defined:
|
||
|
self.report_error(
|
||
|
GraphQLError(
|
||
|
"Cannot define a new schema within a schema extension.", node
|
||
|
)
|
||
|
)
|
||
|
else:
|
||
|
if self.schema_definitions_count:
|
||
|
self.report_error(
|
||
|
GraphQLError("Must provide only one schema definition.", node)
|
||
|
)
|
||
|
self.schema_definitions_count += 1
|