Passed
Push — develop ( 5df010...37d230 )
by Brent
07:25
created

PageParser::parse()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 16
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 1
dl 0
loc 16
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
        $adapterConfigurations =
59 24
            $pageConfiguration['config']
60 19
            ?? $pageConfiguration['adapters']
61 24
            ?? [];
62
63 24
        foreach ($adapterConfigurations as $adapterType => $adapterConfiguration) {
64 16
            $adapter = $this->adapterFactory->create($adapterType, $adapterConfiguration);
65
66 16
            $adaptedPageEntries = [];
67
68 16
            foreach ($pageEntries as $pageToTransform) {
69 16
                $adaptedPageEntries = array_merge(
70 16
                    $adaptedPageEntries,
71 16
                    $adapter->transform($pageToTransform)
72
                );
73
            }
74
75 16
            $pageEntries = $adaptedPageEntries;
76
        }
77
78 24
        return $pageEntries;
79
    }
80
81 24
    private function parsePage($inputConfiguration): Page
82
    {
83 24
        return $this->pageFactory->create($inputConfiguration);
84
    }
85
}
86