Passed
Push — develop ( fd6dfe...a0544e )
by Brent
02:41
created

AdapterFactory::create()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 3.0416

Importance

Changes 0
Metric Value
cc 3
eloc 6
nc 3
nop 2
dl 0
loc 12
ccs 5
cts 6
cp 0.8333
crap 3.0416
rs 9.4285
c 0
b 0
f 0
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 27
    public function __construct(VariableParser $variableParser)
15
    {
16 27
        $this->setCollectionRule();
17 27
        $this->setFilterRule();
18 27
        $this->setPaginationRule();
19 27
        $this->setOrderRule();
20
21 27
        $this->variableParser = $variableParser;
22 27
    }
23
24 23
    public static function make(VariableParser $variableParser): AdapterFactory
25
    {
26 23
        return new self($variableParser);
27
    }
28
29 17
    public function create($adapterType, $adapterConfiguration): ?Adapter
30
    {
31 17
        foreach ($this->getRules() as $rule) {
32 17
            $adapter = $rule($adapterType, (array) $adapterConfiguration);
33
34 17
            if ($adapter) {
35 17
                return $adapter;
36
            }
37
        }
38
39
        return null;
40
    }
41
42 27
    private function setCollectionRule(): void
43
    {
44 27
        $this->setRule(
45 27
            CollectionAdapter::class,
46 27
            function (string $adapterType, array $adapterConfiguration) {
47 17
                if ($adapterType !== 'collection') {
48 14
                    return null;
49
                }
50
51 15
                return CollectionAdapter::make($adapterConfiguration, $this->variableParser);
52 27
            }
53
        );
54 27
    }
55
56 27
    private function setFilterRule(): void
57
    {
58 27
        $this->setRule(
59 27
            FilterAdapter::class,
60 27
            function (string $adapterType, array $adapterConfiguration) {
61 14
                if ($adapterType !== 'filter') {
62 14
                    return null;
63
                }
64
65 1
                return FilterAdapter::make($adapterConfiguration, $this->variableParser);
66 27
            }
67
        );
68 27
    }
69
70 27
    private function setPaginationRule(): void
71
    {
72 27
        $this->setRule(
73 27
            PaginationAdapter::class,
74 27
            function (string $adapterType, array $adapterConfiguration) {
75 14
                if ($adapterType !== 'pagination') {
76
                    return null;
77
                }
78
79 14
                return PaginationAdapter::make($adapterConfiguration, $this->variableParser);
80 27
            }
81
        );
82 27
    }
83
84 27
    private function setOrderRule(): void
85
    {
86 27
        $this->setRule(
87 27
            OrderAdapter::class,
88 27
            function (string $adapterType, array $adapterConfiguration) {
89
                if ($adapterType !== 'order') {
90
                    return null;
91
                }
92
93
                return OrderAdapter::make($adapterConfiguration, $this->variableParser);
94 27
            }
95
        );
96 27
    }
97
}
98