Passed
Push — master ( 823aee...b9b37f )
by Alec
13:15 queued 12s
created

StyleFrameRenderer::createFrame()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 6
c 0
b 0
f 0
nc 2
nop 2
dl 0
loc 12
rs 10
1
<?php
2
3
declare(strict_types=1);
4
// 10.03.23
5
6
namespace AlecRabbit\Spinner\Core;
7
8
use AlecRabbit\Spinner\Contract\ColorMode;
9
use AlecRabbit\Spinner\Contract\IFrame;
10
use AlecRabbit\Spinner\Core\A\AFrameRenderer;
11
use AlecRabbit\Spinner\Core\Factory\FrameFactory;
12
use AlecRabbit\Spinner\Core\Pattern\Contract\IStylePattern;
13
use AlecRabbit\Spinner\Exception\InvalidArgumentException;
14
use AlecRabbit\Spinner\Exception\LogicException;
15
16
final class StyleFrameRenderer extends AFrameRenderer
17
{
18
    private const FG = 'fg';
19
    private const BG = 'bg';
20
    private const COLOR_ARRAY_SIZE = 2;
21
22
    private ColorMode $patternColorMode;
23
    private ColorMode $terminalColorMode;
24
25
    public function __construct(
26
        IStylePattern $pattern
27
    ) {
28
        $this->patternColorMode = $pattern->getColorMode();
29
        $this->terminalColorMode = self::getDefaults()->getTerminalSettings()->getColorMode();
30
        parent::__construct($pattern);
31
    }
32
33
    /**
34
     * @throws LogicException
35
     * @throws InvalidArgumentException
36
     */
37
    protected function createFrame(int|string $entry, bool $bg = false): IFrame
38
    {
39
        if ($this->terminalColorMode === ColorMode::NONE) {
40
            return FrameFactory::create('%s', 0);
41
        }
42
43
        $color = $this->patternColorMode->simplest($this->terminalColorMode)->ansiCode($entry);
44
45
        return
46
            FrameFactory::create(
47
                Sequencer::colorSequence(($bg ? '4' : '3') . $color . 'm%s'),
48
                0
49
            );
50
    }
51
52
    /**
53
     * @throws InvalidArgumentException
54
     * @throws LogicException
55
     */
56
    protected function createFromArray(array $entry): IFrame
57
    {
58
        $this->assertEntryArray($entry);
59
60
        if ($this->terminalColorMode === ColorMode::NONE) {
61
            return FrameFactory::create('%s', 0);
62
        }
63
64
        $fgColor = $this->patternColorMode->simplest($this->terminalColorMode)->ansiCode((string)$entry[self::FG]);
65
        $bgColor = $this->patternColorMode->simplest($this->terminalColorMode)->ansiCode((string)$entry[self::BG]);
66
67
        return
68
            FrameFactory::create(
69
                Sequencer::colorSequence('3' . $fgColor . ';4' . $bgColor . 'm%s'),
70
                0
71
            );
72
    }
73
74
    /**
75
     * @throws InvalidArgumentException
76
     */
77
    private function assertEntryArray(array $entry): void
78
    {
79
        $size = count($entry);
80
        $expectedSize = 2;
81
        if (self::COLOR_ARRAY_SIZE !== $size) {
82
            throw new InvalidArgumentException(
83
                sprintf(
84
                    'Array should contain %d elements, %d given.',
85
                    $expectedSize,
86
                    $size
87
                )
88
            );
89
        }
90
        if (!array_key_exists(self::FG, $entry) || !array_key_exists(self::BG, $entry)) {
91
            throw new InvalidArgumentException(
92
                sprintf(
93
                    'Array should contain keys "%s" and "%s", keys ["%s"] given.',
94
                    self::FG,
95
                    self::BG,
96
                    implode('", "', array_keys($entry))
97
                )
98
            );
99
        }
100
    }
101
}
102