nur-sery/src/cli/DynamicCommand.php

83 lines
2.2 KiB
PHP
Raw Normal View History

2024-01-01 00:45:31 +04:00
<?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;
}
}