Passed
Push — master ( 08fc53...49e16b )
by Christoffer
02:58 queued 42s
created

UniqueArgumentNamesRule   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 34
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 5
dl 0
loc 34
rs 10
c 0
b 0
f 0

1 Method

Rating   Name   Duplication   Size   Complexity  
B enterNode() 0 24 5
1
<?php
2
3
namespace Digia\GraphQL\Validation\Rule;
4
5
use Digia\GraphQL\Error\ValidationException;
6
use Digia\GraphQL\Language\Node\ArgumentNode;
7
use Digia\GraphQL\Language\Node\DirectiveNode;
8
use Digia\GraphQL\Language\Node\FieldNode;
9
use Digia\GraphQL\Language\Node\NodeInterface;
10
use function Digia\GraphQL\Validation\duplicateArgumentMessage;
11
12
/**
13
 * Unique argument names
14
 *
15
 * A GraphQL field or directive is only valid if all supplied arguments are
16
 * uniquely named.
17
 */
18
class UniqueArgumentNamesRule extends AbstractRule
19
{
20
    /**
21
     * @var string[]
22
     */
23
    protected $knownArgumentNames = [];
24
25
    /**
26
     * @inheritdoc
27
     */
28
    public function enterNode(NodeInterface $node): ?NodeInterface
29
    {
30
        if ($node instanceof FieldNode || $node instanceof DirectiveNode) {
31
            $this->knownArgumentNames = [];
32
        }
33
34
        if ($node instanceof ArgumentNode) {
35
            $argumentName = $node->getNameValue();
36
37
            if (isset($this->knownArgumentNames[$argumentName])) {
38
                $this->validationContext->reportError(
39
                    new ValidationException(
40
                        duplicateArgumentMessage($argumentName),
41
                        [$this->knownArgumentNames[$argumentName], $node->getName()]
42
                    )
43
                );
44
            } else {
45
                $this->knownArgumentNames[$argumentName] = $node->getName();
46
            }
47
48
            return null;
49
        }
50
51
        return $node;
52
    }
53
}
54