Passed
Branch v2 (aaaa8e)
by Brent
03:38
created

AdapterFactory::create()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 12
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 6
nc 3
nop 2
1
<?php
2
3
namespace Stitcher\Page\Adapter;
4
5
use Stitcher\Adapter;
6
use Stitcher\DynamicFactory;
7
use Stitcher\Variable\VariableParser;
8
9
class AdapterFactory extends DynamicFactory
10
{
11
    private $variableParser;
12
13
    public function __construct(VariableParser $variableParser)
14
    {
15
        $this->setCollectionRule();
16
        $this->setFilterRule();
17
        $this->setPaginationRule();
18
19
        $this->variableParser = $variableParser;
20
    }
21
22
    public static function make(VariableParser $variableParser): AdapterFactory
23
    {
24
        return new self($variableParser);
25
    }
26
27
    public function create($adapterType, $adapterConfiguration): ?Adapter
28
    {
29
        foreach ($this->getRules() as $rule) {
30
            $adapter = $rule($adapterType, $adapterConfiguration);
31
32
            if ($adapter) {
33
                return $adapter;
34
            }
35
        }
36
37
        return null;
38
    }
39
40
    private function setCollectionRule(): void
41
    {
42
        $this->setRule(CollectionAdapter::class, function (string $adapterType, array $adapterConfiguration) {
43
            if ($adapterType === 'collection') {
44
                return CollectionAdapter::make($adapterConfiguration, $this->variableParser);
45
            }
46
47
            return null;
48
        });
49
    }
50
51
    private function setFilterRule(): void
52
    {
53
        $this->setRule(FilterAdapter::class, function (string $adapterType, array $adapterConfiguration) {
54
            if ($adapterType === 'filter') {
55
                return FilterAdapter::make($adapterConfiguration, $this->variableParser);
56
            }
57
58
            return null;
59
        });
60
    }
61
62
    private function setPaginationRule(): void
63
    {
64
        $this->setRule(PaginationAdapter::class, function (string $adapterType, array $adapterConfiguration) {
65
            if ($adapterType === 'pagination') {
66
                return PaginationAdapter::make($adapterConfiguration, $this->variableParser);
67
            }
68
69
            return null;
70
        });
71
    }
72
}
73