-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathScriptClassLauncher.php
More file actions
113 lines (89 loc) · 4.22 KB
/
ScriptClassLauncher.php
File metadata and controls
113 lines (89 loc) · 4.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?php
declare(strict_types=1);
namespace MagicPush\CliToolkit\Parametizer\ScriptClass\ScriptClassLauncher;
use MagicPush\CliToolkit\Parametizer\Config\Builder\ConfigBuilder;
use MagicPush\CliToolkit\Parametizer\Parametizer;
use MagicPush\CliToolkit\Parametizer\ScriptClass\ScriptClassLauncher\Subcommand\ClearCache\ClearCache;
use MagicPush\CliToolkit\Parametizer\ScriptClass\ScriptClassLauncher\Subcommand\ClearCache\ClearCacheContext;
use MagicPush\CliToolkit\Parametizer\ScriptDetector\ScriptClassDetector;
class ScriptClassLauncher {
protected readonly ConfigBuilder $configBuilder;
protected bool $useParentEnvConfigForSubcommands = false;
protected bool $throwOnException = false;
protected function __construct(protected readonly ScriptClassDetector $scriptClassDetector) { }
public static function create(
ScriptClassDetector $scriptClassDetector,
?ConfigBuilder $configBuilder = null,
): static {
$launcher = new static($scriptClassDetector);
if (null !== $configBuilder) {
$launcher->configBuilder = $configBuilder;
}
return $launcher;
}
/**
* The flag does not affect built-in subcommands - those always utilize a parent environment config.
*/
public function useParentEnvConfigForSubcommands(bool $isEnabled = true): static {
$this->useParentEnvConfigForSubcommands = $isEnabled;
return $this;
}
/**
* Always affects subcommands. Also, affects main {@see ConfigBuilder} instance only if the latter is created
* automatically - if `null` (default value) is passed to {@see static::__construct()}'s connected parameter.
*
* By default (without this method call), the corresponding internal property value is `false`.
*
* @see Parametizer::newConfig()
*/
public function throwOnException(bool $isEnabled = true): static {
$this->throwOnException = $isEnabled;
return $this;
}
public function execute(): void {
if (!isset($this->configBuilder)) {
$this->configBuilder = Parametizer::newConfig(null, $this->throwOnException);
}
$envConfigForSubcommands = $this->useParentEnvConfigForSubcommands
? $this->configBuilder->getConfig()->getEnvConfig()
: null;
$classNamesBySubcommandNames = $this->scriptClassDetector
->getDetectedData();
// Init a subcommand switch - ensure built-in subcommands are added even if no custom subcommands are detected.
$this->configBuilder->newSubcommandSwitch('subcommand-name');
foreach ($classNamesBySubcommandNames as $subcommandName => $className) {
$this->configBuilder->newSubcommand(
$subcommandName,
$className::getConfigBuilder(
$envConfigForSubcommands,
$this->throwOnException,
),
);
}
if ($this->scriptClassDetector->doesCacheFileExist()) {
$subcommandNameClearCache = ClearCache::getScriptName();
$contextClearCache = new ClearCacheContext($this->scriptClassDetector->getCacheFilePath());
$this->configBuilder->newSubcommand(
$subcommandNameClearCache,
// Like other built-in subcommands, this one should utilize a parent (launcher's) config.
ClearCache::getConfigBuilder(
$this->configBuilder->getConfig()->getEnvConfig(),
$this->throwOnException,
$contextClearCache,
),
);
} else {
$subcommandNameClearCache = null;
$contextClearCache = null;
}
$request = $this->configBuilder->run();
$requestedSubcommandName = $request->getRequestedSubcommandName();
if ($contextClearCache && $subcommandNameClearCache === $requestedSubcommandName) {
$scriptClass = new ClearCache($request->getSubcommandRequest(), $contextClearCache);
} else {
$className = $classNamesBySubcommandNames[$requestedSubcommandName];
$scriptClass = new $className($request->getSubcommandRequest());
}
$scriptClass->execute();
}
}