Completed
Pull Request — master (#42)
by Simon
01:57
created

ConfigMerger::mergeDynamicVariables()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 2
1
<?php declare(strict_types=1);
2
3
namespace Shopware\Psh\Config;
4
5
class ConfigMerger
6
{
7
    /**
8
     * @param Config $config
9
     * @param Config|null $override
10
     * @return Config
11
     */
12
    public function merge(Config $config, Config $override = null): Config
13
    {
14
        if ($override === null) {
15
            return $config;
16
        }
17
18
        $header = $config->getHeader();
19
        $defaultEnvironment = $config->getDefaultEnvironment();
20
        $environments = $config->getEnvironments();
21
22
        if ($override->getHeader()) {
23
            $header = $override->getHeader();
24
        }
25
26
        if ($override->getEnvironments()) {
27
            $environments = $this->mergeConfigEnvironments($config, $override);
28
        }
29
30
        if ($override->getDefaultEnvironment()) {
31
            $defaultEnvironment = $override->getDefaultEnvironment();
32
        }
33
34
        return new Config($header, $defaultEnvironment, $environments);
35
    }
36
37
    /**
38
     * @param Config $config
39
     * @param Config $override
40
     * @return array
41
     */
42
    private function mergeConfigEnvironments(Config $config, Config $override): array
43
    {
44
        $environments = [];
45
        foreach ($override->getEnvironments() as $name => $overrideEnv) {
46
            $originalConfigEnv = $config->getEnvironments()[$name];
47
48
            $environments[$name] = new ConfigEnvironment(
49
                $this->overridePaths($originalConfigEnv, $overrideEnv),
50
                $this->mergeDynamicVariables($config->getEnvironments()[$name], $overrideEnv),
51
                $this->mergeConstants($config->getEnvironments()[$name], $overrideEnv),
52
                $this->overrideTemplates($config->getEnvironments()[$name], $overrideEnv)
53
            );
54
        }
55
56
        return $environments;
57
    }
58
59
    /**
60
     * @param ConfigEnvironment $configEnvironment
61
     * @param ConfigEnvironment $overrideEnv
62
     * @return array
63
     */
64
    private function mergeDynamicVariables(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideEnv): array
65
    {
66
        return array_merge($configEnvironment->getDynamicVariables(), $overrideEnv->getDynamicVariables());
67
    }
68
69
    /**
70
     * @param ConfigEnvironment $configEnvironment
71
     * @param ConfigEnvironment $overrideConfigEnv
72
     * @return array|ScriptPath[]
73
     */
74
    private function overridePaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv)
75
    {
76
        if ($overrideConfigEnv->getAllScriptPaths()) {
77
            return $overrideConfigEnv->getAllScriptPaths();
78
        }
79
80
        return $configEnvironment->getAllScriptPaths();
81
    }
82
83
    /**
84
     * @param ConfigEnvironment $configEnvironment
85
     * @param ConfigEnvironment $overrideConfigEnv
86
     * @return array
87
     */
88
    private function mergeConstants(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
89
    {
90
        return array_merge($configEnvironment->getConstants(), $overrideConfigEnv->getConstants());
91
    }
92
93
    /**
94
     * @param ConfigEnvironment $configEnvironment
95
     * @param $overrideConfigEnv
96
     * @return array
97
     */
98
    private function overrideTemplates(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
99
    {
100
        if ($overrideConfigEnv->getTemplates()) {
101
            return $overrideConfigEnv->getTemplates();
102
        }
103
104
        return $configEnvironment->getTemplates();
105
    }
106
}