Passed
Push — master ( df7929...33655b )
by Atanas
02:06
created

ExtendsConfigTrait::replaceConfig()   A

Complexity

Conditions 6
Paths 4

Size

Total Lines 19
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 42

Importance

Changes 0
Metric Value
eloc 10
c 0
b 0
f 0
dl 0
loc 19
ccs 0
cts 11
cp 0
rs 9.2222
cc 6
nc 4
nop 2
crap 42
1
<?php
2
/**
3
 * @package   WPEmerge
4
 * @author    Atanas Angelov <[email protected]>
5
 * @copyright 2017-2019 Atanas Angelov
6
 * @license   https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0
7
 * @link      https://wpemerge.com/
8
 */
9
10
namespace WPEmerge\ServiceProviders;
11
12
use Pimple\Container;
13
use WPEmerge\Support\Arr;
14
15
/**
16
 * Allows objects to extend the config.
17
 */
18
trait ExtendsConfigTrait {
19
	/**
20
	 * Recursively replace default values with the passed config.
21
	 * - If either value is not an array, the config value will be used.
22
	 * - If both are an indexed array, the config value will be used.
23
	 * - If either is a keyed array, array_replace will be used with config having priority.
24
	 *
25
	 * @param  mixed $default
26
	 * @param  mixed $config
27
	 * @return mixed
28
	 */
29
	protected function replaceConfig( $default, $config ) {
30
		if ( ! is_array( $default ) || ! is_array( $config ) ) {
31
			return $config;
32
		}
33
34
		$default_is_indexed = array_keys( $default ) === range( 0, count( $default ) - 1 );
35
		$config_is_indexed = array_keys( $config ) === range( 0, count( $config ) - 1 );
36
37
		if ( $default_is_indexed && $config_is_indexed ) {
38
			return $config;
39
		}
40
41
		$result = $default;
42
43
		foreach ( $config as $key => $value ) {
44
			$result[ $key ] = $this->replaceConfig( Arr::get( $default, $key ), $value );
45
		}
46
47
		return $result;
48
	}
49
50
	/**
51
	 * Extends the WP Emerge config in the container with a new key.
52
	 *
53
	 * @param  Container $container
54
	 * @param  string    $key
55
	 * @param  mixed     $default
56
	 * @return void
57
	 */
58 4
	public function extendConfig( $container, $key, $default ) {
59 4
		$config = isset( $container[ WPEMERGE_CONFIG_KEY ] ) ? $container[ WPEMERGE_CONFIG_KEY ] : [];
60 4
		$config = Arr::get( $config, $key, $default );
61
62 4
		$container[ WPEMERGE_CONFIG_KEY ] = array_merge(
63 4
			$container[ WPEMERGE_CONFIG_KEY ],
64 4
			[$key => $this->replaceConfig( $default, $config )]
65
		);
66 4
	}
67
}
68