Completed
Pull Request — master (#37)
by Greg
03:21 queued 01:22
created

RenderCellCollectionTrait::renderCell()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 18
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 18
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 10
nc 3
nop 3
1
<?php
2
namespace Consolidation\OutputFormatters\StructuredData;
3
4
use Consolidation\OutputFormatters\Options\FormatterOptions;
5
6
trait RenderCellCollectionTrait
7
{
8
9
    /** @var RenderCellInterface[] */
10
    protected $rendererList = [
11
        RenderCellCollectionInterface::PRIORITY_FIRST => [],
12
        RenderCellCollectionInterface::PRIORITY_NORMAL => [],
13
        RenderCellCollectionInterface::PRIORITY_FALLBACK => [],
14
    ];
15
16
    /**
17
     * Add a renderer
18
     *
19
     * @return $this
20
     */
21
    public function addRenderer(RenderCellInterface $renderer, $priority = RenderCellCollectionInterface::PRIORITY_NORMAL)
22
    {
23
        $this->rendererList[$priority][] = $renderer;
24
        return $this;
25
    }
26
27
    /**
28
     * Add a callable as a renderer
29
     *
30
     * @return $this
31
     */
32
    public function addRendererFunction(callable $rendererFn, $priority = RenderCellCollectionInterface::PRIORITY_NORMAL)
33
    {
34
        $renderer = new CallableRenderer($rendererFn);
35
        return $this->addRenderer($renderer, $priority);
36
    }
37
38
    /**
39
     * {@inheritdoc}
40
     */
41
    public function renderCell($key, $cellData, FormatterOptions $options)
42
    {
43
        $flattenedRendererList = array_reduce(
44
            $this->rendererList,
45
            function ($carry, $item) {
46
                return array_merge($carry, $item);
47
            },
48
            []
49
        );
50
51
        foreach ($flattenedRendererList as $renderer) {
52
            $cellData = $renderer->renderCell($key, $cellData, $options);
53
            if (is_string($cellData)) {
54
                return $cellData;
55
            }
56
        }
57
        return $cellData;
58
    }
59
}
60