Completed
Push — master ( d234f3...0a4926 )
by Jan Philipp
47s queued 12s
created

ConfigMerger::mergeOverride()   A

Complexity

Conditions 4
Paths 5

Size

Total Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 21
rs 9.584
c 0
b 0
f 0
cc 4
nc 5
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
        );
71
    }
72
73
    private function mergeEnvironmentsAsImport(ConfigEnvironment $original, ConfigEnvironment $import): ConfigEnvironment
74
    {
75
        return new ConfigEnvironment(
76
            $this->overrideHidden($original, $import),
77
            $this->mergeScriptsPaths($original, $import),
78
            $this->mergeDynamicVariables($original, $import),
79
            $this->mergeConstants($original, $import),
80
            $this->mergeTemplates($original, $import),
81
            $this->mergeDotenvPaths($original, $import)
82
        );
83
    }
84
85
    private function mergeDynamicVariables(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideEnv): array
86
    {
87
        return array_merge($configEnvironment->getDynamicVariables(), $overrideEnv->getDynamicVariables());
88
    }
89
90
    /**
91
     * @return ScriptsPath[]
92
     */
93
    private function mergeDotenvPaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
94
    {
95
        return array_merge($configEnvironment->getDotenvPaths(), $overrideConfigEnv->getDotenvPaths());
96
    }
97
98
    /**
99
     * @return ScriptsPath[]
100
     */
101
    private function mergeScriptsPaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
102
    {
103
        return array_merge($configEnvironment->getAllScriptsPaths(), $overrideConfigEnv->getAllScriptsPaths());
104
    }
105
106
    /**
107
     * @return ScriptsPath[]
108
     */
109
    private function overrideScriptsPaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
110
    {
111
        if ($overrideConfigEnv->getAllScriptsPaths()) {
112
            return $overrideConfigEnv->getAllScriptsPaths();
113
        }
114
115
        return $configEnvironment->getAllScriptsPaths();
116
    }
117
118
    private function mergeConstants(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
119
    {
120
        return array_merge($configEnvironment->getConstants(), $overrideConfigEnv->getConstants());
121
    }
122
123
    private function overrideTemplates(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
124
    {
125
        if ($overrideConfigEnv->getTemplates()) {
126
            return $overrideConfigEnv->getTemplates();
127
        }
128
129
        return $configEnvironment->getTemplates();
130
    }
131
132
    private function mergeTemplates(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
133
    {
134
        return array_merge($configEnvironment->getTemplates(), $overrideConfigEnv->getTemplates());
135
    }
136
137
    private function overrideHidden(ConfigEnvironment $originalConfigEnv, ConfigEnvironment $overrideEnv): bool
138
    {
139
        if ($overrideEnv->isHidden()) {
140
            return true;
141
        }
142
143
        return $originalConfigEnv->isHidden();
144
    }
145
146
    private function getAllEnvironmentNames(Config $config, Config $override): array
147
    {
148
        return array_keys(array_merge($config->getEnvironments(), $override->getEnvironments()));
149
    }
150
151
    private function mapEnvironments(Config $config, Config $override, callable $closure): array
152
    {
153
        $environments = [];
154
155
        $foundEnvironments = $this->getAllEnvironmentNames($config, $override);
156
157
        foreach ($foundEnvironments as $name) {
158
            if (!isset($override->getEnvironments()[$name])) {
159
                $environments[$name] = $config->getEnvironments()[$name];
160
161
                continue;
162
            }
163
164
            if (!isset($config->getEnvironments()[$name])) {
165
                $environments[$name] = $override->getEnvironments()[$name];
166
167
                continue;
168
            }
169
170
            $environments[$name] = $closure($config->getEnvironments()[$name], $override->getEnvironments()[$name]);
171
        }
172
173
        return $environments;
174
    }
175
}
176