Passed
Push — develop ( 37d230...30ebd1 )
by Brent
03:14
created

PageParser::adaptPageEntries()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 15
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 8
nc 2
nop 2
dl 0
loc 15
ccs 8
cts 8
cp 1
crap 2
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace Stitcher\Page;
4
5
use Illuminate\Support\Collection;
6
use Stitcher\Page\Adapter\AdapterFactory;
7
8
class PageParser
9
{
10
    private $pageFactory;
11
    private $adapterFactory;
12
    private $currentPage;
13
14 26
    public function __construct(PageFactory $pageFactory, AdapterFactory $adapterFactory)
15
    {
16 26
        $this->pageFactory = $pageFactory;
17 26
        $this->adapterFactory = $adapterFactory;
18 26
    }
19
20 22
    public static function make(PageFactory $factory, AdapterFactory $adapterFactory): PageParser
21
    {
22 22
        return new self($factory, $adapterFactory);
23
    }
24
25 24
    public function parse($pageConfiguration): Collection
26
    {
27 24
        $result = [];
28
29 24
        $pageEntries = $this->parseAdapterConfiguration($pageConfiguration);
30
31 24
        foreach ($pageEntries as $pageEntry) {
32 24
            $page = $this->parsePage($pageEntry);
33
34 24
            $this->setCurrentPage($page);
35
36 24
            $result[$page->id()] = $page;
37
        }
38
39 24
        return collect($result);
40
    }
41
42
    public function getCurrentPage(): ?Page
43
    {
44
        return $this->currentPage;
45
    }
46
47 24
    private function setCurrentPage(Page $page): PageParser
48
    {
49 24
        $this->currentPage = $page;
50
51 24
        return $this;
52
    }
53
54 24
    private function parseAdapterConfiguration(array $pageConfiguration): array
55
    {
56 24
        $pageEntries = [$pageConfiguration];
57
58
        $adapters =
59 24
            $pageConfiguration['config']
60 19
            ?? $pageConfiguration['adapters']
61 24
            ?? [];
62
63 24
        foreach ($adapters as $adapterType => $adapterConfiguration) {
64 16
            $adapter = $this->adapterFactory->create(
65 16
                $adapterType,
66 16
                $adapterConfiguration
67
            );
68
69 16
            $pageEntries = $this->adaptPageEntries($pageEntries, $adapter);
70
        }
71
72 24
        return $pageEntries;
73
    }
74
75 16
    private function adaptPageEntries(array $pageEntries, Adapter $adapter): array
76
    {
77 16
        $adaptedPageEntries = [];
78
79 16
        foreach ($pageEntries as $pageToTransform) {
80 16
            $adaptedPageEntries = array_merge(
81 16
                $adaptedPageEntries,
82 16
                $adapter->transform($pageToTransform)
83
            );
84
        }
85
86 16
        $pageEntries = $adaptedPageEntries;
87
88 16
        return $pageEntries;
89
    }
90
91 24
    private function parsePage($inputConfiguration): Page
92
    {
93 24
        return $this->pageFactory->create($inputConfiguration);
94
    }
95
}
96