Test Failed
Push — 1.0.x ( 6a8d30...d6b731 )
by Xavier Serrat
03:27
created

ToggleConfig::assertDriverOptions()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 13
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 0
Metric Value
cc 3
eloc 8
nc 3
nop 1
dl 0
loc 13
ccs 0
cts 3
cp 0
crap 12
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
        $this->assertDriverOptions($config);
92
    }
93
94
    /**
95
     * @param array<string, mixed> $config
96
     * @return void
97
     */
98
    private function assertDriverOptions(array $config): void
99
    {
100
        if (self::DRIVER_CHAIN === $config['driver']) {
101
            Assert::keyExists($config, 'driver_options');
102
            Assert::isArray($config['driver_options']);
103
            Assert::notEmpty($config['driver_options']);
104
            Assert::allInArray($config['driver_options'], self::VALID_DRIVER_OPTIONS);
105
106
            return;
107
        }
108
109
        if (array_key_exists('driver_options', $config)) {
110
            throw new \InvalidArgumentException('"driver_options" is only allowed for "chain" driver');
111
        }
112
    }
113 2
114
    public function apiEnabled(): bool
115 2
    {
116
        return $this->apiEnabled;
117
    }
118
119
    public function apiPrefix(): string
120
    {
121
        return $this->apiPrefix;
122
    }
123
124
    public function driver(): string
125
    {
126
        return $this->driver;
127
    }
128
129
    /**
130
     * @return array<string>
131
     */
132
    public function driverOptions(): array
133
    {
134
        return $this->driverOptions;
135
    }
136
137
    /**
138
     * @return array<array<string, string>>
139
     */
140
    public function strategyTypes(): array
141
    {
142
        return $this->strategyTypes;
143
    }
144
145
    /**
146
     * @return array<array<string, string>>
147
     */
148
    public function segmentTypes(): array
149
    {
150
        return $this->segmentTypes;
151
    }
152
153
    /**
154
     * @return array<string, mixed>
155
     */
156
    public function toggles(): array
157
    {
158
        return $this->toggles;
159
    }
160
}
161