FeatureFinderFactory   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 62
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 2
Bugs 0 Features 1
Metric Value
eloc 29
dl 0
loc 62
ccs 28
cts 28
cp 1
rs 10
c 2
b 0
f 1
wmc 9

3 Methods

Rating   Name   Duplication   Size   Complexity  
A create() 0 33 5
A getDriverConfig() 0 7 1
A __invoke() 0 16 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Pheature\Crud\Psr11\Toggle;
6
7
use Doctrine\DBAL\Connection;
8
use InvalidArgumentException;
9
use Pheature\Core\Toggle\Read\ChainFeatureFinder;
10
use Pheature\Core\Toggle\Read\ChainToggleStrategyFactory;
11
use Pheature\Core\Toggle\Read\FeatureFinder;
12
use Pheature\Dbal\Toggle\Read\DbalFeatureFactory;
13
use Pheature\Dbal\Toggle\Read\DbalFeatureFinder;
14
use Pheature\InMemory\Toggle\InMemoryConfig;
15
use Pheature\InMemory\Toggle\InMemoryFeatureFactory;
16
use Pheature\InMemory\Toggle\InMemoryFeatureFinder;
17
use Psr\Container\ContainerInterface;
18
19
final class FeatureFinderFactory
20
{
21 3
    public function __invoke(ContainerInterface $container): FeatureFinder
22
    {
23
        /** @var ToggleConfig $config */
24 3
        $config = $container->get(ToggleConfig::class);
25
        /** @var ChainToggleStrategyFactory $chainToggleStrategyFactory */
26 3
        $chainToggleStrategyFactory = $container->get(ChainToggleStrategyFactory::class);
27 3
        $connection = null;
28
        if (
29 3
            ToggleConfig::DRIVER_DBAL === $config->driver()
30 3
            || true === in_array(ToggleConfig::DRIVER_DBAL, $config->driverOptions(), true)
31
        ) {
32
            /** @var ?Connection $connection */
33 2
            $connection = $container->get(Connection::class);
34
        }
35
36 3
        return self::create($config, $chainToggleStrategyFactory, $connection);
37
    }
38
39 7
    public static function create(
40
        ToggleConfig $config,
41
        ChainToggleStrategyFactory $chainToggleStrategyFactory,
42
        ?Connection $connection
43
    ): FeatureFinder {
44
45 7
        $driver = $config->driver();
46
47 7
        if (ToggleConfig::DRIVER_IN_MEMORY === $driver) {
48 4
            return new InMemoryFeatureFinder(
49 4
                new InMemoryConfig($config->toggles()),
50 4
                new InMemoryFeatureFactory(
51
                    $chainToggleStrategyFactory
52
                )
53
            );
54
        }
55
56 5
        if (ToggleConfig::DRIVER_DBAL === $driver) {
57
            /** @var Connection $connection */
58 3
            return new DbalFeatureFinder($connection, new DbalFeatureFactory($chainToggleStrategyFactory));
59
        }
60
61 3
        if (ToggleConfig::DRIVER_CHAIN === $driver) {
62 2
            $drivers = [];
63 2
            foreach ($config->driverOptions() as $driverOption) {
64 2
                $driverConfig = self::getDriverConfig($driverOption, $config);
65 2
                $drivers[] = self::create($driverConfig, $chainToggleStrategyFactory, $connection);
66
            }
67
68 2
            return new ChainFeatureFinder(...$drivers);
69
        }
70
71 1
        throw new InvalidArgumentException('Valid driver required');
72
    }
73
74 2
    private static function getDriverConfig(string $driverOption, ToggleConfig $config): ToggleConfig
75
    {
76 2
        return new ToggleConfig([
77
            'driver' => $driverOption,
78 2
            'api_enabled' => $config->apiEnabled(),
79 2
            'api_prefix' => $config->apiPrefix(),
80 2
            'toggles' => $config->toggles(),
81
        ]);
82
    }
83
}
84