AdapterFactory   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 89
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
dl 0
loc 89
ccs 0
cts 51
cp 0
rs 10
c 0
b 0
f 0
wmc 13
lcom 1
cbo 5

7 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 1
A make() 0 4 1
A create() 0 12 3
A setCollectionRule() 0 13 2
A setFilterRule() 0 13 2
A setPaginationRule() 0 13 2
A setOrderRule() 0 13 2
1
<?php
2
3
namespace Stitcher\Page\Adapter;
4
5
use Stitcher\Page\Adapter;
6
use Stitcher\DynamicFactory;
7
use Stitcher\Variable\VariableParser;
8
9
class AdapterFactory extends DynamicFactory
10
{
11
    /** @var \Stitcher\Variable\VariableParser */
12
    protected $variableParser;
13
14
    public function __construct(VariableParser $variableParser)
15
    {
16
        $this->setCollectionRule();
17
        $this->setFilterRule();
18
        $this->setPaginationRule();
19
        $this->setOrderRule();
20
21
        $this->variableParser = $variableParser;
22
    }
23
24
    public static function make(VariableParser $variableParser): AdapterFactory
25
    {
26
        return new self($variableParser);
27
    }
28
29
    public function create($adapterType, $adapterConfiguration): ?Adapter
30
    {
31
        foreach ($this->getRules() as $rule) {
32
            $adapter = $rule($adapterType, (array) $adapterConfiguration);
33
34
            if ($adapter) {
35
                return $adapter;
36
            }
37
        }
38
39
        return null;
40
    }
41
42
    private function setCollectionRule(): void
43
    {
44
        $this->setRule(
45
            CollectionAdapter::class,
46
            function (string $adapterType, array $adapterConfiguration) {
47
                if ($adapterType !== 'collection') {
48
                    return null;
49
                }
50
51
                return CollectionAdapter::make($adapterConfiguration, $this->variableParser);
52
            }
53
        );
54
    }
55
56
    private function setFilterRule(): void
57
    {
58
        $this->setRule(
59
            FilterAdapter::class,
60
            function (string $adapterType, array $adapterConfiguration) {
61
                if ($adapterType !== 'filter') {
62
                    return null;
63
                }
64
65
                return FilterAdapter::make($adapterConfiguration, $this->variableParser);
66
            }
67
        );
68
    }
69
70
    private function setPaginationRule(): void
71
    {
72
        $this->setRule(
73
            PaginationAdapter::class,
74
            function (string $adapterType, array $adapterConfiguration) {
75
                if ($adapterType !== 'pagination') {
76
                    return null;
77
                }
78
79
                return PaginationAdapter::make($adapterConfiguration, $this->variableParser);
80
            }
81
        );
82
    }
83
84
    private function setOrderRule(): void
85
    {
86
        $this->setRule(
87
            OrderAdapter::class,
88
            function (string $adapterType, array $adapterConfiguration) {
89
                if ($adapterType !== 'order') {
90
                    return null;
91
                }
92
93
                return OrderAdapter::make($adapterConfiguration, $this->variableParser);
94
            }
95
        );
96
    }
97
}
98