Test Failed
Pull Request — 1.0.x (#6)
by Xavier Serrat
12:19
created

ToggleConfig::driverOptions()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
ccs 0
cts 0
cp 0
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Pheature\Crud\Psr11\Toggle;
6
7
use Webmozart\Assert\Assert;
8
9
final class ToggleConfig
10
{
11
    public const DRIVER_IN_MEMORY = 'inmemory';
12
    public const DRIVER_DBAL = 'dbal';
13
    public const DRIVER_CHAIN = 'chain';
14
    private const VALID_DRIVERS = [
15
        self::DRIVER_IN_MEMORY,
16
        self::DRIVER_DBAL,
17
        self::DRIVER_CHAIN,
18
    ];
19
    private const VALID_DRIVER_OPTIONS = [
20
        self::DRIVER_IN_MEMORY,
21
        self::DRIVER_DBAL,
22
    ];
23
24
    private string $driver;
25
    /** @var array<string> */
26
    private $driverOptions;
27
    private bool $apiEnabled;
28
    private string $apiPrefix;
29
    /** @var array<array<string, string>> */
30
    private array $strategyTypes;
31 12
    /** @var array<array<string, string>> */
32
    private array $segmentTypes;
33 12
    /** @var array<string, mixed> */
34 9
    private array $toggles;
35 9
36 9
    /**
37 9
     * @param array<string, mixed> $config
38
     */
39 9
    public function __construct(array $config)
40 9
    {
41 9
        $this->assertDriver($config);
42 9
        Assert::keyExists($config, 'api_enabled');
43 9
        Assert::boolean($config['api_enabled']);
44 9
        Assert::keyExists($config, 'api_prefix');
45
        Assert::string($config['api_prefix']);
46 9
47 1
        $this->apiEnabled = $config['api_enabled'];
48
        $this->apiPrefix = $config['api_prefix'];
49 1
50 1
        $this->driver = (string) $config['driver'];
51
        /** @var array<string> $driverOptions */
52
        $driverOptions = $config['driver_options'] ?? [];
53 9
        $this->driverOptions = $driverOptions;
54 1
55
        $this->strategyTypes = [];
56 1
        $this->segmentTypes = [];
57 1
        $this->toggles = [];
58
59
        if (array_key_exists('strategy_types', $config)) {
60 9
            Assert::isArray($config['strategy_types']);
61 1
            /** @var array<array<string, string>> $strategyTypes */
62
            $strategyTypes = $config['strategy_types'];
63 1
            $this->strategyTypes = $strategyTypes;
64 1
        }
65
66 9
        if (array_key_exists('segment_types', $config)) {
67
            Assert::isArray($config['segment_types']);
68
            /** @var array<array<string, string>> $segmentTypes */
69
            $segmentTypes = $config['segment_types'];
70
            $this->segmentTypes = $segmentTypes;
71
        }
72 12
73
        if (array_key_exists('toggles', $config)) {
74 12
            Assert::isArray($config['toggles']);
75 11
            /** @var array<string, mixed> $toggles */
76 11
            $toggles = $config['toggles'];
77 9
            $this->toggles = $toggles;
78
        }
79
    }
80
81
    /**
82
     * @param array<string, mixed> $config
83
     * @return void
84
     */
85
    private function assertDriver(array $config): void
86
    {
87
        Assert::keyExists($config, 'driver');
88
        Assert::string($config['driver']);
89 8
        Assert::inArray($config['driver'], self::VALID_DRIVERS);
90
91 8
        if (self::DRIVER_CHAIN === $config['driver']) {
92
            Assert::keyExists($config, 'driver_options');
93
            Assert::isArray($config['driver_options']);
94
            Assert::notEmpty($config['driver_options']);
95
            Assert::allInArray($config['driver_options'], self::VALID_DRIVER_OPTIONS);
96
        }
97
    }
98
99
    public function apiEnabled(): bool
100
    {
101
        return $this->apiEnabled;
102
    }
103
104
    public function apiPrefix(): string
105
    {
106
        return $this->apiPrefix;
107
    }
108
109
    public function driver(): string
110
    {
111
        return $this->driver;
112
    }
113 2
114
    /**
115 2
     * @return array<string>
116
     */
117
    public function driverOptions(): array
118
    {
119
        return $this->driverOptions;
120
    }
121
122
    /**
123
     * @return array<array<string, string>>
124
     */
125
    public function strategyTypes(): array
126
    {
127
        return $this->strategyTypes;
128
    }
129
130
    /**
131
     * @return array<array<string, string>>
132
     */
133
    public function segmentTypes(): array
134
    {
135
        return $this->segmentTypes;
136
    }
137
138
    /**
139
     * @return array<string, mixed>
140
     */
141
    public function toggles(): array
142
    {
143
        return $this->toggles;
144
    }
145
}
146