FeatureFinderFactoryPass::process()   A
last analyzed

Complexity

Conditions 5
Paths 4

Size

Total Lines 35
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 25
c 1
b 0
f 0
dl 0
loc 35
rs 9.2088
cc 5
nc 4
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Pheature\Community\Symfony\DependencyInjection;
6
7
use Doctrine\DBAL\Connection;
8
use Pheature\Core\Toggle\Read\ChainToggleStrategyFactory;
9
use Pheature\Core\Toggle\Read\FeatureFinder;
10
use Pheature\Core\Toggle\Write\FeatureRepository;
11
use Pheature\Crud\Psr11\Toggle\FeatureFinderFactory;
12
use Pheature\Crud\Psr11\Toggle\FeatureRepositoryFactory;
13
use Pheature\Crud\Psr11\Toggle\ToggleConfig;
14
use Pheature\InMemory\Toggle\InMemoryFeatureFactory;
15
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
16
use Symfony\Component\DependencyInjection\ContainerBuilder;
17
use Symfony\Component\DependencyInjection\Reference;
18
use Webmozart\Assert\Assert;
19
20
final class FeatureFinderFactoryPass implements CompilerPassInterface
21
{
22
    public function process(ContainerBuilder $container): void
23
    {
24
        /** @var array<array<mixed>> $pheatureFlagsConfig */
25
        $pheatureFlagsConfig = $container->getExtensionConfig('pheature_flags');
26
        $mergedConfig = array_merge(...$pheatureFlagsConfig);
27
28
        $finder = $container->register(FeatureFinder::class, FeatureFinder::class)
29
            ->setAutowired(false)
30
            ->setLazy(true)
31
            ->setFactory([FeatureFinderFactory::class, 'create'])
32
            ->addArgument(new Reference(ToggleConfig::class))
33
            ->addArgument(new Reference(ChainToggleStrategyFactory::class));
34
35
        Assert::keyExists($mergedConfig, 'driver');
36
        Assert::string($mergedConfig['driver']);
37
        Assert::keyExists($mergedConfig, 'driver_options');
38
        Assert::isArray($mergedConfig['driver_options']);
39
40
        if (
41
            ToggleConfig::DRIVER_DBAL === $mergedConfig['driver']
42
            || true === in_array(ToggleConfig::DRIVER_DBAL, $mergedConfig['driver_options'], true)
43
        ) {
44
            $finder->addArgument(new Reference(Connection::class));
45
        } else {
46
            $finder->addArgument(null);
47
        }
48
49
        if (
50
            ToggleConfig::DRIVER_IN_MEMORY === $mergedConfig['driver']
51
            || true === in_array(ToggleConfig::DRIVER_IN_MEMORY, $mergedConfig['driver_options'], true)
52
        ) {
53
            $container->register(InMemoryFeatureFactory::class, InMemoryFeatureFactory::class)
54
                ->setAutowired(false)
55
                ->setLazy(true)
56
                ->addArgument(new Reference(ChainToggleStrategyFactory::class));
57
        }
58
    }
59
}
60