Completed
Pull Request — master (#45)
by Christoffer
02:12
created

KnownTypeNamesRule   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 28
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 28
rs 10
c 0
b 0
f 0
wmc 7

1 Method

Rating   Name   Duplication   Size   Complexity  
C enterNode() 0 23 7
1
<?php
2
3
namespace Digia\GraphQL\Validation\Rule;
4
5
use Digia\GraphQL\Error\ValidationException;
6
use Digia\GraphQL\Language\AST\Node\InputObjectTypeDefinitionNode;
7
use Digia\GraphQL\Language\AST\Node\InterfaceTypeDefinitionNode;
8
use Digia\GraphQL\Language\AST\Node\NamedTypeNode;
9
use Digia\GraphQL\Language\AST\Node\NodeInterface;
10
use Digia\GraphQL\Language\AST\Node\ObjectTypeDefinitionNode;
11
use Digia\GraphQL\Language\AST\Node\UnionTypeDefinitionNode;
12
use function Digia\GraphQL\Util\suggestionList;
13
14
class KnownTypeNamesRule extends AbstractRule
15
{
16
    /**
17
     * @inheritdoc
18
     */
19
    public function enterNode(NodeInterface $node): ?NodeInterface
20
    {
21
        if ($node instanceof ObjectTypeDefinitionNode || $node instanceof InterfaceTypeDefinitionNode || $node instanceof UnionTypeDefinitionNode || $node instanceof InputObjectTypeDefinitionNode) {
22
            // TODO: when validating IDL, re-enable these. Experimental version does not add unreferenced types, resulting in false-positive errors. Squelched errors for now.
23
            return null;
24
        }
25
26
        if ($node instanceof NamedTypeNode) {
27
            $schema   = $this->context->getSchema();
28
            $typeName = $node->getNameValue();
29
            $type     = $schema->getType($typeName);
30
31
            if (null === $type) {
32
                $this->context->reportError(
33
                    new ValidationException(
34
                        unknownTypeMessage($typeName, suggestionList($typeName, array_keys($schema->getTypeMap()))),
35
                        [$node]
36
                    )
37
                );
38
            }
39
        }
40
41
        return $node;
42
    }
43
}
44