Passed
Pull Request — master (#63)
by Christoffer
02:11
created

KnownTypeNamesRule::enterNode()   C

Complexity

Conditions 7
Paths 4

Size

Total Lines 23
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 12
nc 4
nop 1
dl 0
loc 23
rs 6.7272
c 0
b 0
f 0
1
<?php
2
3
namespace Digia\GraphQL\Validation\Rule;
4
5
use Digia\GraphQL\Error\ValidationException;
6
use Digia\GraphQL\Language\Node\InputObjectTypeDefinitionNode;
7
use Digia\GraphQL\Language\Node\InterfaceTypeDefinitionNode;
8
use Digia\GraphQL\Language\Node\NamedTypeNode;
9
use Digia\GraphQL\Language\Node\NodeInterface;
10
use Digia\GraphQL\Language\Node\ObjectTypeDefinitionNode;
11
use Digia\GraphQL\Language\Node\UnionTypeDefinitionNode;
12
use function Digia\GraphQL\Util\suggestionList;
13
use function Digia\GraphQL\Validation\unknownTypeMessage;
14
15
/**
16
 * Known type names
17
 *
18
 * A GraphQL document is only valid if referenced types (specifically
19
 * variable definitions and fragment conditions) are defined by the type schema.
20
 */
21
class KnownTypeNamesRule extends AbstractRule
22
{
23
    /**
24
     * @inheritdoc
25
     */
26
    public function enterNode(NodeInterface $node): ?NodeInterface
27
    {
28
        if ($node instanceof ObjectTypeDefinitionNode || $node instanceof InterfaceTypeDefinitionNode || $node instanceof UnionTypeDefinitionNode || $node instanceof InputObjectTypeDefinitionNode) {
29
            // TODO: when validating IDL, re-enable these. Experimental version does not add unreferenced types, resulting in false-positive errors. Squelched errors for now.
30
            return null;
31
        }
32
33
        if ($node instanceof NamedTypeNode) {
34
            $schema   = $this->validationContext->getSchema();
35
            $typeName = $node->getNameValue();
36
            $type     = $schema->getType($typeName);
37
38
            if (null === $type) {
39
                $this->validationContext->reportError(
40
                    new ValidationException(
41
                        unknownTypeMessage($typeName, suggestionList($typeName, array_keys($schema->getTypeMap()))),
42
                        [$node]
43
                    )
44
                );
45
            }
46
        }
47
48
        return $node;
49
    }
50
}
51