84 lines
2.2 KiB
PHP
84 lines
2.2 KiB
PHP
<?php
|
|
namespace nur\cli;
|
|
|
|
use nur\A;
|
|
use nur\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;
|
|
}
|
|
}
|