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

ACoreDefaults::defaultTerminalProbes()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 3
rs 10
1
<?php
2
3
declare(strict_types=1);
4
// 10.03.23
5
6
namespace AlecRabbit\Spinner\Core\Defaults\A;
7
8
use AlecRabbit\Spinner\Contract\IProbe;
9
use AlecRabbit\Spinner\Contract\RunMode;
10
use AlecRabbit\Spinner\Core\Contract\ILoopProbe;
11
use AlecRabbit\Spinner\Core\Defaults\Contract\IDefaults;
12
use AlecRabbit\Spinner\Core\Defaults\Contract\IDefaultsClasses;
13
use AlecRabbit\Spinner\Core\Defaults\Contract\IDriverSettings;
14
use AlecRabbit\Spinner\Core\Defaults\Contract\ILoopSettings;
15
use AlecRabbit\Spinner\Core\Defaults\Contract\ISpinnerSettings;
16
use AlecRabbit\Spinner\Core\Defaults\Contract\ITerminalSettings;
17
use AlecRabbit\Spinner\Core\Defaults\Contract\IWidgetSettings;
18
use AlecRabbit\Spinner\Core\Defaults\Mixin\DefaultsConst;
19
use AlecRabbit\Spinner\Core\Pattern\Contract\IPattern;
20
use AlecRabbit\Spinner\Core\Terminal\Contract\ITerminalProbe;
21
use AlecRabbit\Spinner\Exception\InvalidArgumentException;
22
use AlecRabbit\Spinner\Helper\Asserter;
23
use Traversable;
24
25
use function is_subclass_of;
26
27
abstract class ACoreDefaults implements IDefaults
28
{
29
    use DefaultsConst;
30
31
    protected static IDefaultsClasses $classes;
32
    protected static IDriverSettings $driverSettings;
33
    protected static ILoopSettings $loopSettings;
34
    protected static ISpinnerSettings $spinnerSettings;
35
    protected static ITerminalSettings $terminalSettings;
36
    protected static IWidgetSettings $rootWidgetSettings;
37
    protected static IWidgetSettings $widgetSettings;
38
    protected static Traversable $loopProbes;
39
    protected static ?IPattern $charPattern = null;
40
    protected static ?IPattern $stylePattern = null;
41
    protected static int $millisecondsInterval;
42
    protected static string $percentNumberFormat;
43
    protected static RunMode $runMode;
44
    protected static float|int $shutdownDelay;
45
    protected static float|int $shutdownMaxDelay;
46
    /**
47
     * @var resource
48
     */
49
    protected static $outputStream;
50
    protected static Traversable $terminalProbes;
51
    private static array $registeredLoopProbes = [];
52
    private static array $registeredTerminalProbes = [];
53
54
    final protected function __construct()
55
    {
56
        $this->reset();
57
    }
58
59
    protected function reset(): void
60
    {
61
        static::$classes = $this->createDefaultsClasses();
62
        static::$driverSettings = $this->createDriverSettings();
63
        static::$loopProbes = $this->defaultLoopProbes();
64
        static::$loopSettings = $this->createLoopSettings();
65
        static::$spinnerSettings = $this->createSpinnerSettings();
66
        static::$outputStream = $this->defaultOutputStream();
67
        static::$terminalProbes = $this->defaultTerminalProbes();
68
        static::$terminalSettings = $this->createTerminalSettings();
69
        static::$rootWidgetSettings = $this->createWidgetSettings();
70
        static::$widgetSettings = $this->createWidgetSettings();
71
72
        static::$millisecondsInterval = static::INTERVAL_MS;
0 ignored issues
show
Bug introduced by
The constant AlecRabbit\Spinner\Core\...reDefaults::INTERVAL_MS was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
73
        static::$percentNumberFormat = static::PERCENT_NUMBER_FORMAT;
0 ignored issues
show
Bug introduced by
The constant AlecRabbit\Spinner\Core\...::PERCENT_NUMBER_FORMAT was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
74
        static::$runMode = static::RUN_MODE;
0 ignored issues
show
Bug introduced by
The constant AlecRabbit\Spinner\Core\...ACoreDefaults::RUN_MODE was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
75
        static::$shutdownDelay = static::SHUTDOWN_DELAY;
0 ignored issues
show
Bug introduced by
The constant AlecRabbit\Spinner\Core\...efaults::SHUTDOWN_DELAY was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
76
        static::$shutdownMaxDelay = static::SHUTDOWN_MAX_DELAY;
0 ignored issues
show
Bug introduced by
The constant AlecRabbit\Spinner\Core\...lts::SHUTDOWN_MAX_DELAY was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
77
78
        static::$stylePattern = null;
79
        static::$charPattern = null;
80
    }
81
82
    abstract protected function createDefaultsClasses(): IDefaultsClasses;
83
84
    abstract protected function createDriverSettings(): IDriverSettings;
85
86
    protected function defaultLoopProbes(): Traversable
87
    {
88
        yield from self::$registeredLoopProbes;
89
    }
90
91
    abstract protected function createLoopSettings(): ILoopSettings;
92
93
    abstract protected function createSpinnerSettings(): ISpinnerSettings;
94
95
    /**
96
     * @return resource
97
     */
98
    protected function defaultOutputStream()
99
    {
100
        return STDERR;
101
    }
102
103
    protected function defaultTerminalProbes(): Traversable
104
    {
105
        yield from self::$registeredTerminalProbes;
106
    }
107
108
    abstract protected function createTerminalSettings(): ITerminalSettings;
109
110
    abstract protected function createWidgetSettings(): IWidgetSettings;
111
112
    /** @inheritdoc */
113
    public static function registerProbeClass(string $class): void
114
    {
115
        Asserter::assertClassExists($class, __METHOD__);
116
        Asserter::isSubClass($class, IProbe::class, __METHOD__);
117
118
        if (is_subclass_of($class, ILoopProbe::class)) {
119
            static::registerLoopProbeClass($class);
120
            return;
121
        }
122
        if (is_subclass_of($class, ITerminalProbe::class)) {
123
            static::registerTerminalProbeClass($class);
124
            return;
125
        }
126
        throw new InvalidArgumentException(
127
            sprintf(
128
                'Unsupported probe class: %s. Supported: [%s].',
129
                $class,
130
                implode(
131
                    separator: ', ',
132
                    array: [
133
                        ILoopProbe::class,
134
                        ITerminalProbe::class
135
                    ],
136
                ),
137
            )
138
        );
139
    }
140
141
    /**
142
     * @param class-string $class
0 ignored issues
show
Documentation Bug introduced by
The doc comment class-string at position 0 could not be parsed: Unknown type name 'class-string' at position 0 in class-string.
Loading history...
143
     * @throws InvalidArgumentException
144
     */
145
    protected static function registerLoopProbeClass(string $class): void
146
    {
147
        Asserter::isSubClass($class, ILoopProbe::class, __METHOD__);
148
149
        if (!in_array($class, self::$registeredLoopProbes, true)) {
150
            self::$registeredLoopProbes[] = $class;
151
        }
152
    }
153
154
    /**
155
     * @param class-string $class
0 ignored issues
show
Documentation Bug introduced by
The doc comment class-string at position 0 could not be parsed: Unknown type name 'class-string' at position 0 in class-string.
Loading history...
156
     * @throws InvalidArgumentException
157
     */
158
    protected static function registerTerminalProbeClass(string $class): void
159
    {
160
        Asserter::isSubClass($class, ITerminalProbe::class, __METHOD__);
161
162
        if (!in_array($class, self::$registeredTerminalProbes, true)) {
163
            self::$registeredTerminalProbes[] = $class;
164
        }
165
    }
166
}
167