DriverNodeBuilder::getDriverKeyValidator()   A
last analyzed

Complexity

Conditions 2
Paths 1

Size

Total Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 12
rs 9.8666
c 0
b 0
f 0
cc 2
nc 1
nop 0
1
<?php
2
3
namespace Bex\Behat\ExtensionDriverLocator;
4
5
use Bex\Behat\ExtensionDriverLocator\DriverClassNameResolver;
6
use Bex\Behat\ExtensionDriverLocator\DriverClassValidator;
7
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
8
9
class DriverNodeBuilder
10
{
11
    /**
12
     * @var DriverClassNameResolver
13
     */
14
    private $driverClassNameResolver;
15
16
    /**
17
     * @param DriverClassNameResolver $driverClassNameResolver
18
     */
19
    public function __construct(DriverClassNameResolver $driverClassNameResolver)
20
    {
21
        $this->driverClassNameResolver = $driverClassNameResolver;
22
    }
23
24
    /**
25
     * @param  string $namespace
26
     * @param  string $parent
27
     *
28
     * @return NodeBuilder
29
     */
30
    public static function getInstance($namespace, $parent = '')
31
    {
32
        return new self(new DriverClassNameResolver($namespace, new DriverClassValidator($parent)));
33
    }
34
35
    /**
36
     * @param  ArrayNodeDefinition $builder
37
     * @param  string              $activeDriversNodeName
38
     * @param  string              $driversNodeName
39
     * @param  array | string      $defaultActiveDrivers
40
     *
41
     * @return void
42
     */
43
    public function buildDriverNodes(
44
        ArrayNodeDefinition $builder,
45
        $activeDriversNodeName,
46
        $driversNodeName,
47
        $defaultActiveDrivers
48
    ) {
49
        $defaultActiveDrivers = (is_array($defaultActiveDrivers)) ? $defaultActiveDrivers : [$defaultActiveDrivers];
50
        $builder
51
            ->children()
52
                ->variableNode($activeDriversNodeName)
53
                    ->defaultValue($defaultActiveDrivers)
54
                    ->beforeNormalization()
55
                        ->ifString()
56
                        ->then($this->getDefaultValueInitializer())
57
                    ->end()
58
                    ->validate()
59
                        ->ifTrue($this->getDriverKeyValidator())
60
                        ->thenInvalid('%s')
61
                    ->end()
62
                ->end()
63
                ->arrayNode($driversNodeName)
64
                    ->useAttributeAsKey('name')
65
                    ->prototype('array')
66
                        ->useAttributeAsKey('name')
67
                        ->prototype('scalar')->end()
68
                    ->end()
69
                ->end()
70
            ->end();
71
    }
72
73
    /**
74
     * @return \Closure
75
     */
76
    private function getDefaultValueInitializer()
77
    {
78
        return function ($value) {
79
            return [$value];
80
        };
81
    }
82
83
    /**
84
     * @return \Closure
85
     */
86
    private function getDriverKeyValidator()
87
    {
88
        $classNameResolver = $this->driverClassNameResolver;
89
        
90
        return function ($driverKeys) use ($classNameResolver) {
91
            foreach ($driverKeys as $driverKey) {
92
                $classNameResolver->getClassNameByDriverKey($driverKey);
93
            }
94
95
            return false;
96
        };
97
    }
98
}