Passed
Pull Request — master (#173)
by Christoffer
02:44
created

BuildingContext   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 102
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 12
dl 0
loc 102
c 0
b 0
f 0
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A buildDirectives() 0 21 3
A getSchemaDefinition() 0 3 1
A buildQueryType() 0 4 2
A buildSubscriptionType() 0 4 2
A buildTypes() 0 5 1
A __construct() 0 8 1
A buildMutationType() 0 4 2
1
<?php
2
3
namespace Digia\GraphQL\Schema\Building;
4
5
use Digia\GraphQL\Language\Node\DirectiveDefinitionNode;
6
use Digia\GraphQL\Language\Node\DocumentNode;
7
use Digia\GraphQL\Language\Node\SchemaDefinitionNode;
8
use Digia\GraphQL\Language\Node\TypeDefinitionNodeInterface;
9
use Digia\GraphQL\Schema\DefinitionBuilderInterface;
10
use Digia\GraphQL\Schema\ResolverRegistryInterface;
11
use Digia\GraphQL\Type\Definition\Directive;
12
use Digia\GraphQL\Type\Definition\TypeInterface;
13
use function Digia\GraphQL\Util\arraySome;
14
15
class BuildingContext implements BuildingContextInterface
16
{
17
    /**
18
     * @var ResolverRegistryInterface
19
     */
20
    protected $resolverRegistry;
21
22
    /**
23
     * @var DefinitionBuilderInterface
24
     */
25
    protected $definitionBuilder;
26
27
    /**
28
     * @var BuildingInfo
29
     */
30
    protected $info;
31
32
    /**
33
     * BuilderContext constructor.
34
     * @param ResolverRegistryInterface  $resolverRegistry
35
     * @param DefinitionBuilderInterface $definitionBuilder
36
     * @param BuildingInfo               $info
37
     */
38
    public function __construct(
39
        ResolverRegistryInterface $resolverRegistry,
40
        DefinitionBuilderInterface $definitionBuilder,
41
        BuildingInfo $info
42
    ) {
43
        $this->resolverRegistry  = $resolverRegistry;
44
        $this->definitionBuilder = $definitionBuilder;
45
        $this->info              = $info;
46
    }
47
48
    /**
49
     * @return TypeInterface|null
50
     */
51
    public function buildQueryType(): ?TypeInterface
52
    {
53
        $definition = $this->info->getOperationTypeDefinition('query');
54
        return null !== $definition ? $this->definitionBuilder->buildType($definition) : null;
55
    }
56
57
    /**
58
     * @return TypeInterface|null
59
     */
60
    public function buildMutationType(): ?TypeInterface
61
    {
62
        $definition = $this->info->getOperationTypeDefinition('mutation');
63
        return null !== $definition ? $this->definitionBuilder->buildType($definition) : null;
64
    }
65
66
    /**
67
     * @return TypeInterface|null
68
     */
69
    public function buildSubscriptionType(): ?TypeInterface
70
    {
71
        $definition = $this->info->getOperationTypeDefinition('subscription');
72
        return null !== $definition ? $this->definitionBuilder->buildType($definition) : null;
73
    }
74
75
    /**
76
     * @return TypeInterface[]
77
     */
78
    public function buildTypes(): array
79
    {
80
        return \array_map(function (TypeDefinitionNodeInterface $definition) {
81
            return $this->definitionBuilder->buildType($definition);
82
        }, \array_values($this->info->getTypeDefinitionMap()));
83
    }
84
85
    /**
86
     * @return Directive[]
87
     */
88
    public function buildDirectives(): array
89
    {
90
        $directives = \array_map(function (DirectiveDefinitionNode $definition) {
91
            return $this->definitionBuilder->buildDirective($definition);
92
        }, $this->info->getDirectiveDefinitions());
93
94
        $specifiedDirectivesMap = [
95
            'skip'       => SkipDirective(),
96
            'include'    => IncludeDirective(),
97
            'deprecated' => DeprecatedDirective(),
98
        ];
99
100
        foreach ($specifiedDirectivesMap as $name => $directive) {
101
            if (!arraySome($directives, function (Directive $directive) use ($name) {
102
                return $directive->getName() === $name;
103
            })) {
104
                $directives[] = $directive;
105
            }
106
        }
107
108
        return $directives;
109
    }
110
111
    /**
112
     * @return SchemaDefinitionNode|null
113
     */
114
    public function getSchemaDefinition(): ?SchemaDefinitionNode
115
    {
116
        return $this->info->getSchemaDefinition();
117
    }
118
}
119