83 lines
2.2 KiB
PHP
83 lines
2.2 KiB
PHP
|
<?php
|
||
|
namespace nur\sery\cli;
|
||
|
|
||
|
use nur\sery\php\func;
|
||
|
|
||
|
/**
|
||
|
* Class DynamicCommand: implémentation par défaut de {@link IDynamicCommand}
|
||
|
*
|
||
|
*/
|
||
|
class DynamicCommand implements IDynamicCommand {
|
||
|
/**
|
||
|
* retourner la liste des commandes sous la forme d'un tableau associatif avec
|
||
|
* des éléments { $command => $cdef }
|
||
|
*/
|
||
|
protected function COMMANDS(): array {
|
||
|
return static::COMMANDS;
|
||
|
} const COMMANDS = null;
|
||
|
|
||
|
private $commands;
|
||
|
private $dcommands;
|
||
|
private $aliases;
|
||
|
|
||
|
protected function buildCommands(): void {
|
||
|
if ($this->commands !== null) return;
|
||
|
$commands = [];
|
||
|
$dcommands = [];
|
||
|
$aliases = [];
|
||
|
$index = 0;
|
||
|
foreach ($this->COMMANDS() as $key => $cdef) {
|
||
|
if ($key === $index) {
|
||
|
$index++;
|
||
|
[$cnames, $assoc] = A::split_assoc($cdef);
|
||
|
$cname = $cnames[0];
|
||
|
if ($cname === null) {
|
||
|
# commande complètement dynamique
|
||
|
$dcommands[] = $cnames[2];
|
||
|
if ($cnames[1] === null) continue;
|
||
|
$cdef = [null, $cnames[1]];
|
||
|
$cname = $cnames[1][0];
|
||
|
$cnames = [];
|
||
|
}
|
||
|
} else {
|
||
|
$cname = $key;
|
||
|
$cnames = [$cname];
|
||
|
[$seq, $assoc] = A::split_assoc($cdef);
|
||
|
A::merge($cnames, $seq);
|
||
|
A::merge_assoc($cdef, $cnames, $assoc, true);
|
||
|
}
|
||
|
$commands[$cname] = $cdef;
|
||
|
foreach ($cnames as $key) {
|
||
|
$aliases[$key] = $cname;
|
||
|
}
|
||
|
}
|
||
|
$this->commands = $commands;
|
||
|
$this->dcommands = $dcommands;
|
||
|
$this->aliases = $aliases;
|
||
|
}
|
||
|
|
||
|
function getCommands(): ?array {
|
||
|
$this->buildCommands();
|
||
|
return array_keys($this->commands);
|
||
|
}
|
||
|
|
||
|
function getCommandDefs(string $command, bool $virtual): ?array {
|
||
|
$this->buildCommands();
|
||
|
$command = A::get($this->aliases, $command, $command);
|
||
|
$cdef = A::get($this->commands, $command);
|
||
|
if ($cdef !== null) {
|
||
|
if ($cdef[0] === null) {
|
||
|
if ($virtual) $cdef = $cdef[1];
|
||
|
else return null;
|
||
|
}
|
||
|
return $cdef !== null? [$cdef]: null;
|
||
|
}
|
||
|
# tester les commandes complètement dynamiques
|
||
|
foreach ($this->dcommands as $func) {
|
||
|
$cdef = func::call($func, $command);
|
||
|
if ($cdef !== null) return [$cdef];
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
}
|