Completed
Pull Request — master (#111)
by Jan Philipp
07:12 queued 01:44
created

ConfigMerger::mergeRequiredVariables()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 2
1
<?php declare(strict_types=1);
2
3
namespace Shopware\Psh\Config;
4
5
use function array_keys;
6
use function array_merge;
7
8
class ConfigMerger
9
{
10
    public function mergeOverride(Config $config, ?Config $override = null): Config
11
    {
12
        if ($override === null) {
13
            return $config;
14
        }
15
16
        $header = $config->getHeader();
17
        $defaultEnvironment = $config->getDefaultEnvironment();
18
19
        if ($override->getHeader()) {
20
            $header = $override->getHeader();
21
        }
22
23
        $environments = $this->mergeOverrideConfigEnvironments($config, $override);
24
25
        if ($override->getDefaultEnvironment()) {
26
            $defaultEnvironment = $override->getDefaultEnvironment();
27
        }
28
29
        return new Config(new EnvironmentResolver(), $defaultEnvironment, $environments, $config->getParams(), $header);
30
    }
31
32
    public function mergeImport(Config $config, ?Config $import = null): Config
33
    {
34
        if ($import === null) {
35
            return $config;
36
        }
37
38
        $header = $config->getHeader();
39
        $defaultEnvironment = $config->getDefaultEnvironment();
40
        $environments = $this->mergeImportConfigEnvironments($config, $import);
41
42
        return new Config(new EnvironmentResolver(), $defaultEnvironment, $environments, $config->getParams(), $header);
43
    }
44
45
    private function mergeOverrideConfigEnvironments(Config $config, Config $override): array
46
    {
47
        return $this->mapEnvironments($config, $override, function (ConfigEnvironment $environment, ConfigEnvironment $overrideEnvironment) {
48
            return $this
49
                    ->mergeEnvironmentsAsOverride($environment, $overrideEnvironment);
50
        });
51
    }
52
53
    private function mergeImportConfigEnvironments(Config $config, Config $import): array
54
    {
55
        return $this->mapEnvironments($config, $import, function (ConfigEnvironment $environment, ConfigEnvironment $importEnvironment) {
56
            return $this
57
                    ->mergeEnvironmentsAsImport($environment, $importEnvironment);
58
        });
59
    }
60
61
    private function mergeEnvironmentsAsOverride(ConfigEnvironment $original, ConfigEnvironment $override): ConfigEnvironment
62
    {
63
        return new ConfigEnvironment(
64
            $this->overrideHidden($original, $override),
65
            $this->overrideScriptsPaths($original, $override),
66
            $this->mergeDynamicVariables($original, $override),
67
            $this->mergeConstants($original, $override),
68
            $this->overrideTemplates($original, $override),
69
            $this->mergeDotenvPaths($original, $override),
70
            $this->mergeRequiredVariables($original, $override)
71
        );
72
    }
73
74
    private function mergeEnvironmentsAsImport(ConfigEnvironment $original, ConfigEnvironment $import): ConfigEnvironment
75
    {
76
        return new ConfigEnvironment(
77
            $this->overrideHidden($original, $import),
78
            $this->mergeScriptsPaths($original, $import),
79
            $this->mergeDynamicVariables($original, $import),
80
            $this->mergeConstants($original, $import),
81
            $this->mergeTemplates($original, $import),
82
            $this->mergeDotenvPaths($original, $import),
83
            $this->mergeRequiredVariables($original, $import)
84
        );
85
    }
86
87
    private function mergeDynamicVariables(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideEnv): array
88
    {
89
        return array_merge($configEnvironment->getDynamicVariables(), $overrideEnv->getDynamicVariables());
90
    }
91
92
    /**
93
     * @return ScriptsPath[]
94
     */
95
    private function mergeDotenvPaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
96
    {
97
        return array_merge($configEnvironment->getDotenvPaths(), $overrideConfigEnv->getDotenvPaths());
98
    }
99
100
    /**
101
     * @return ScriptsPath[]
102
     */
103
    private function mergeRequiredVariables(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
104
    {
105
        return array_merge($configEnvironment->getRequiredVariables(), $overrideConfigEnv->getRequiredVariables());
106
    }
107
108
    /**
109
     * @return ScriptsPath[]
110
     */
111
    private function mergeScriptsPaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
112
    {
113
        return array_merge($configEnvironment->getAllScriptsPaths(), $overrideConfigEnv->getAllScriptsPaths());
114
    }
115
116
    /**
117
     * @return ScriptsPath[]
118
     */
119
    private function overrideScriptsPaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
120
    {
121
        if ($overrideConfigEnv->getAllScriptsPaths()) {
122
            return $overrideConfigEnv->getAllScriptsPaths();
123
        }
124
125
        return $configEnvironment->getAllScriptsPaths();
126
    }
127
128
    private function mergeConstants(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
129
    {
130
        return array_merge($configEnvironment->getConstants(), $overrideConfigEnv->getConstants());
131
    }
132
133
    private function overrideTemplates(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
134
    {
135
        if ($overrideConfigEnv->getTemplates()) {
136
            return $overrideConfigEnv->getTemplates();
137
        }
138
139
        return $configEnvironment->getTemplates();
140
    }
141
142
    private function mergeTemplates(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
143
    {
144
        return array_merge($configEnvironment->getTemplates(), $overrideConfigEnv->getTemplates());
145
    }
146
147
    private function overrideHidden(ConfigEnvironment $originalConfigEnv, ConfigEnvironment $overrideEnv): bool
148
    {
149
        if ($overrideEnv->isHidden()) {
150
            return true;
151
        }
152
153
        return $originalConfigEnv->isHidden();
154
    }
155
156
    private function getAllEnvironmentNames(Config $config, Config $override): array
157
    {
158
        return array_keys(array_merge($config->getEnvironments(), $override->getEnvironments()));
159
    }
160
161
    private function mapEnvironments(Config $config, Config $override, callable $closure): array
162
    {
163
        $environments = [];
164
165
        $foundEnvironments = $this->getAllEnvironmentNames($config, $override);
166
167
        foreach ($foundEnvironments as $name) {
168
            if (!isset($override->getEnvironments()[$name])) {
169
                $environments[$name] = $config->getEnvironments()[$name];
170
171
                continue;
172
            }
173
174
            if (!isset($config->getEnvironments()[$name])) {
175
                $environments[$name] = $override->getEnvironments()[$name];
176
177
                continue;
178
            }
179
180
            $environments[$name] = $closure($config->getEnvironments()[$name], $override->getEnvironments()[$name]);
181
        }
182
183
        return $environments;
184
    }
185
}
186