Passed
Push — feature/gacela-config-callable ( 8c5325...d8cdb8 )
by Chema
08:46
created

SetupGacela   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 165
Duplicated Lines 0 %

Test Coverage

Coverage 96.15%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 47
dl 0
loc 165
ccs 50
cts 52
cp 0.9615
rs 10
c 2
b 0
f 0
wmc 20

14 Methods

Rating   Name   Duplication   Size   Complexity  
A fromCallable() 0 6 1
A setSuffixTypesBuilder() 0 5 1
A buildConfig() 0 9 3
A setConfigBuilder() 0 5 1
A setMappingInterfacesBuilder() 0 5 1
A buildMappingInterfaces() 0 14 3
A setSuffixTypesFn() 0 5 1
A setMappingInterfacesFn() 0 5 1
A globalServices() 0 3 1
A fromGacelaConfig() 0 9 1
A setConfigFn() 0 5 1
A externalServices() 0 3 1
A setExternalServices() 0 5 1
A buildSuffixTypes() 0 9 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Gacela\Framework\Bootstrap;
6
7
use Gacela\Framework\Config\GacelaConfigBuilder\ConfigBuilder;
8
use Gacela\Framework\Config\GacelaConfigBuilder\MappingInterfacesBuilder;
9
use Gacela\Framework\Config\GacelaConfigBuilder\SuffixTypesBuilder;
10
11
class SetupGacela extends AbstractSetupGacela
12
{
13
    /** @var ?callable(ConfigBuilder):void */
14
    private $configFn = null;
15
16
    /** @var ?callable(MappingInterfacesBuilder,array<string,mixed>):void */
17
    private $mappingInterfacesFn = null;
18
19
    /** @var ?callable(SuffixTypesBuilder):void */
20
    private $suffixTypesFn = null;
21
22
    /** @var array<string,mixed> */
23
    private array $externalServices = [];
24
25
    private ?ConfigBuilder $configBuilder = null;
26
27
    private ?SuffixTypesBuilder $suffixTypesBuilder = null;
28
29
    private ?MappingInterfacesBuilder $mappingInterfacesBuilder = null;
30
31
    /**
32
     * @param callable(GacelaConfig):void $setupGacelaFileFn
33
     */
34 2
    public static function fromCallable(callable $setupGacelaFileFn): self
35
    {
36 2
        $gacelaConfig = new GacelaConfig();
37 2
        $setupGacelaFileFn($gacelaConfig);
38
39 2
        return self::fromGacelaConfig($gacelaConfig);
40
    }
41
42 14
    public static function fromGacelaConfig(GacelaConfig $gacelaConfig): self
43
    {
44 14
        $build = $gacelaConfig->build();
45
46 14
        return (new self())
47 14
            ->setConfigBuilder($build['config-builder'])
48 14
            ->setSuffixTypesBuilder($build['suffix-types-builder'])
49 14
            ->setMappingInterfacesBuilder($build['mapping-interfaces-builder'])
50 14
            ->setExternalServices($build['external-services']);
51
    }
52
53 14
    public function setMappingInterfacesBuilder(MappingInterfacesBuilder $builder): self
54
    {
55 14
        $this->mappingInterfacesBuilder = $builder;
56
57 14
        return $this;
58
    }
59
60 14
    public function setSuffixTypesBuilder(SuffixTypesBuilder $builder): self
61
    {
62 14
        $this->suffixTypesBuilder = $builder;
63
64 14
        return $this;
65
    }
66
67 14
    public function setConfigBuilder(ConfigBuilder $builder): self
68
    {
69 14
        $this->configBuilder = $builder;
70
71 14
        return $this;
72
    }
73
74
    /**
75
     * @param callable(ConfigBuilder):void $callable
76
     */
77 10
    public function setConfigFn(callable $callable): self
78
    {
79 10
        $this->configFn = $callable;
80
81 10
        return $this;
82
    }
83
84 43
    public function buildConfig(ConfigBuilder $configBuilder): ConfigBuilder
85
    {
86 43
        if ($this->configBuilder) {
87 14
            $configBuilder = $this->configBuilder;
88
        }
89
90 43
        $this->configFn && ($this->configFn)($configBuilder);
91
92 43
        return $configBuilder;
93
    }
94
95
    /**
96
     * @param callable(MappingInterfacesBuilder,array<string,mixed>):void $callable
97
     */
98 3
    public function setMappingInterfacesFn(callable $callable): self
99
    {
100 3
        $this->mappingInterfacesFn = $callable;
101
102 3
        return $this;
103
    }
104
105
    /**
106
     * Define the mapping between interfaces and concretions, so Gacela services will auto-resolve them automatically.
107
     *
108
     * @param array<string,mixed> $externalServices
109
     */
110 43
    public function buildMappingInterfaces(
111
        MappingInterfacesBuilder $mappingInterfacesBuilder,
112
        array $externalServices
113
    ): MappingInterfacesBuilder {
114 43
        if ($this->mappingInterfacesBuilder) {
115 14
            $mappingInterfacesBuilder = $this->mappingInterfacesBuilder;
116
        }
117
118 43
        $this->mappingInterfacesFn && ($this->mappingInterfacesFn)(
119
            $mappingInterfacesBuilder,
120 3
            array_merge($this->externalServices, $externalServices)
121
        );
122
123 43
        return $mappingInterfacesBuilder;
124
    }
125
126
    /**
127
     * @param callable(SuffixTypesBuilder):void $callable
128
     */
129 6
    public function setSuffixTypesFn(callable $callable): self
130
    {
131 6
        $this->suffixTypesFn = $callable;
132
133 6
        return $this;
134
    }
135
136
    /**
137
     * Allow overriding gacela resolvable types.
138
     */
139 43
    public function buildSuffixTypes(SuffixTypesBuilder $suffixTypesBuilder): SuffixTypesBuilder
140
    {
141 43
        if ($this->suffixTypesBuilder) {
142 14
            $suffixTypesBuilder = $this->suffixTypesBuilder;
143
        }
144
145 43
        $this->suffixTypesFn && ($this->suffixTypesFn)($suffixTypesBuilder);
146
147 43
        return $suffixTypesBuilder;
148
    }
149
150
    /**
151
     * @param array<string,mixed> $array
152
     */
153 17
    public function setExternalServices(array $array): self
154
    {
155 17
        $this->externalServices = $array;
156
157 17
        return $this;
158
    }
159
160
    /**
161
     * @return array<string,mixed>
162
     *
163
     * @deprecated in favor of `externalServices()`
164
     */
165
    public function globalServices(): array
166
    {
167
        return $this->externalServices();
168
    }
169
170
    /**
171
     * @return array<string,mixed>
172
     */
173 12
    public function externalServices(): array
174
    {
175 12
        return $this->externalServices;
176
    }
177
}
178