Completed
Pull Request — master (#84)
by Nick
01:52
created

ConfigMerger   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 117
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
wmc 15
lcom 1
cbo 2
dl 0
loc 117
rs 10
c 0
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A merge() 0 24 5
A mergeConfigEnvironments() 0 17 2
A mergeDynamicVariables() 0 4 1
A overrideDotenvPaths() 0 8 2
A overrideCommandPaths() 0 8 2
A mergeConstants() 0 4 1
A overrideTemplates() 0 8 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, $config->getParams());
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->overrideCommandPaths($originalConfigEnv, $overrideEnv),
50
                $this->mergeDynamicVariables($config->getEnvironments()[$name], $overrideEnv),
51
                $this->mergeConstants($config->getEnvironments()[$name], $overrideEnv),
52
                $this->overrideTemplates($config->getEnvironments()[$name], $overrideEnv),
53
                $this->overrideDotenvPaths($originalConfigEnv, $overrideEnv)
54
            );
55
        }
56
57
        return $environments;
58
    }
59
60
    /**
61
     * @param ConfigEnvironment $configEnvironment
62
     * @param ConfigEnvironment $overrideEnv
63
     * @return array
64
     */
65
    private function mergeDynamicVariables(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideEnv): array
66
    {
67
        return array_merge($configEnvironment->getDynamicVariables(), $overrideEnv->getDynamicVariables());
68
    }
69
70
    /**
71
     * @param ConfigEnvironment $configEnvironment
72
     * @param ConfigEnvironment $overrideConfigEnv
73
     * @return array|ScriptPath[]
74
     */
75
    private function overrideDotenvPaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
76
    {
77
        if ($overrideConfigEnv->getDotenvPaths()) {
78
            return $overrideConfigEnv->getDotenvPaths();
79
        }
80
81
        return $configEnvironment->getDotenvPaths();
82
    }
83
84
    /**
85
     * @param ConfigEnvironment $configEnvironment
86
     * @param ConfigEnvironment $overrideConfigEnv
87
     * @return array|ScriptPath[]
88
     */
89
    private function overrideCommandPaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
90
    {
91
        if ($overrideConfigEnv->getAllScriptPaths()) {
92
            return $overrideConfigEnv->getAllScriptPaths();
93
        }
94
95
        return $configEnvironment->getAllScriptPaths();
96
    }
97
98
    /**
99
     * @param ConfigEnvironment $configEnvironment
100
     * @param ConfigEnvironment $overrideConfigEnv
101
     * @return array
102
     */
103
    private function mergeConstants(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
104
    {
105
        return array_merge($configEnvironment->getConstants(), $overrideConfigEnv->getConstants());
106
    }
107
108
    /**
109
     * @param ConfigEnvironment $configEnvironment
110
     * @param $overrideConfigEnv
111
     * @return array
112
     */
113
    private function overrideTemplates(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array
114
    {
115
        if ($overrideConfigEnv->getTemplates()) {
116
            return $overrideConfigEnv->getTemplates();
117
        }
118
119
        return $configEnvironment->getTemplates();
120
    }
121
}
122