Passed
Push — feature/gacela-config-callable ( f0c396...2ecc53 )
by Chema
04:10
created

SetupGacela   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 163
Duplicated Lines 0 %

Test Coverage

Coverage 96.08%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 46
dl 0
loc 163
rs 10
c 1
b 0
f 0
ccs 49
cts 51
cp 0.9608
wmc 20

14 Methods

Rating   Name   Duplication   Size   Complexity  
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 7 1
A setConfigFn() 0 5 1
A fromCallable() 0 6 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 1
    public static function fromCallable(callable $setupGacelaFileFn): self
35
    {
36 1
        $gacelaConfig = new GacelaConfig();
37 1
        $setupGacelaFileFn($gacelaConfig);
38
39 1
        return self::fromGacelaConfig($gacelaConfig);
40
    }
41
42 14
    public static function fromGacelaConfig(GacelaConfig $gacelaConfig): self
43
    {
44 14
        return (new self())
45 14
            ->setConfigBuilder($gacelaConfig->getConfigBuilder())
46 14
            ->setSuffixTypesBuilder($gacelaConfig->getSuffixTypesBuilder())
47 14
            ->setMappingInterfacesBuilder($gacelaConfig->getMappingInterfacesBuilder())
48 14
            ->setExternalServices($gacelaConfig->getExternalServices());
49
    }
50
51 14
    public function setMappingInterfacesBuilder(MappingInterfacesBuilder $builder): self
52
    {
53 14
        $this->mappingInterfacesBuilder = $builder;
54
55 14
        return $this;
56
    }
57
58 14
    public function setSuffixTypesBuilder(SuffixTypesBuilder $builder): self
59
    {
60 14
        $this->suffixTypesBuilder = $builder;
61
62 14
        return $this;
63
    }
64
65 14
    public function setConfigBuilder(ConfigBuilder $builder): self
66
    {
67 14
        $this->configBuilder = $builder;
68
69 14
        return $this;
70
    }
71
72
    /**
73
     * @param callable(ConfigBuilder):void $callable
74
     */
75 11
    public function setConfigFn(callable $callable): self
76
    {
77 11
        $this->configFn = $callable;
78
79 11
        return $this;
80
    }
81
82 44
    public function buildConfig(ConfigBuilder $configBuilder): ConfigBuilder
83
    {
84 44
        if ($this->configBuilder) {
85 14
            $configBuilder = $this->configBuilder;
86
        }
87
88 44
        $this->configFn && ($this->configFn)($configBuilder);
89
90 44
        return $configBuilder;
91
    }
92
93
    /**
94
     * @param callable(MappingInterfacesBuilder,array<string,mixed>):void $callable
95
     */
96 3
    public function setMappingInterfacesFn(callable $callable): self
97
    {
98 3
        $this->mappingInterfacesFn = $callable;
99
100 3
        return $this;
101
    }
102
103
    /**
104
     * Define the mapping between interfaces and concretions, so Gacela services will auto-resolve them automatically.
105
     *
106
     * @param array<string,mixed> $externalServices
107
     */
108 44
    public function buildMappingInterfaces(
109
        MappingInterfacesBuilder $mappingInterfacesBuilder,
110
        array $externalServices
111
    ): MappingInterfacesBuilder {
112 44
        if ($this->mappingInterfacesBuilder) {
113 14
            $mappingInterfacesBuilder = $this->mappingInterfacesBuilder;
114
        }
115
116 44
        $this->mappingInterfacesFn && ($this->mappingInterfacesFn)(
117
            $mappingInterfacesBuilder,
118 3
            array_merge($this->externalServices, $externalServices)
119
        );
120
121 44
        return $mappingInterfacesBuilder;
122
    }
123
124
    /**
125
     * @param callable(SuffixTypesBuilder):void $callable
126
     */
127 7
    public function setSuffixTypesFn(callable $callable): self
128
    {
129 7
        $this->suffixTypesFn = $callable;
130
131 7
        return $this;
132
    }
133
134
    /**
135
     * Allow overriding gacela resolvable types.
136
     */
137 44
    public function buildSuffixTypes(SuffixTypesBuilder $suffixTypesBuilder): SuffixTypesBuilder
138
    {
139 44
        if ($this->suffixTypesBuilder) {
140 14
            $suffixTypesBuilder = $this->suffixTypesBuilder;
141
        }
142
143 44
        $this->suffixTypesFn && ($this->suffixTypesFn)($suffixTypesBuilder);
144
145 44
        return $suffixTypesBuilder;
146
    }
147
148
    /**
149
     * @param array<string,mixed> $array
150
     */
151 17
    public function setExternalServices(array $array): self
152
    {
153 17
        $this->externalServices = $array;
154
155 17
        return $this;
156
    }
157
158
    /**
159
     * @return array<string,mixed>
160
     *
161
     * @deprecated in favor of `externalServices()`
162
     */
163
    public function globalServices(): array
164
    {
165
        return $this->externalServices();
166
    }
167
168
    /**
169
     * @return array<string,mixed>
170
     */
171 14
    public function externalServices(): array
172
    {
173 14
        return $this->externalServices;
174
    }
175
}
176