You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.4 KiB
PHP
78 lines
2.4 KiB
PHP
<?php
|
|
|
|
namespace jrosset\CliProgram\AutoPrefix;
|
|
|
|
use Symfony\Component\Console\Command\Command;
|
|
|
|
/**
|
|
* Implements a commands with auto prefix management
|
|
*/
|
|
trait TAutoPrefixManagement {
|
|
/**
|
|
* @var AutoPrefixManagersList The lists of manager for commands auto prefix
|
|
*/
|
|
private AutoPrefixManagersList $autoPrefixManagers;
|
|
|
|
/**
|
|
* The lists of manager for commands auto prefix
|
|
*
|
|
* @return AutoPrefixManagersList The lists of manager for commands auto prefix
|
|
*/
|
|
public function getAutoPrefixManagers (): AutoPrefixManagersList {
|
|
if (!isset($this->autoPrefixManagers)) {
|
|
$this->autoPrefixManagers = new AutoPrefixManagersList();
|
|
}
|
|
return $this->autoPrefixManagers;
|
|
}
|
|
|
|
/**
|
|
* Apply the auto prefix managers on a command (until one of them manage it)
|
|
*
|
|
* @param Command $command The command
|
|
*
|
|
* @return Command The command
|
|
*/
|
|
public function applyAutoPrefixOnCommand (Command $command): Command {
|
|
/** @var IAutoPrefixManager $autoPrefixManager */
|
|
foreach ($this->getAutoPrefixManagers() as $autoPrefixManager) {
|
|
if (($namesPrefix = $autoPrefixManager->getCommandPrefix($command)) !== null) {
|
|
if (mb_strlen($namesPrefix) > 0) {
|
|
$namesPrefix .= ':';
|
|
}
|
|
|
|
if (self::getNamePrefix($command->getName()) !== $namesPrefix) {
|
|
$command->setName($namesPrefix . $command->getName());
|
|
}
|
|
|
|
$aliases = $command->getAliases();
|
|
foreach ($aliases as &$alias) {
|
|
if (self::getNamePrefix($alias) !== $namesPrefix) {
|
|
$alias = $namesPrefix . $alias;
|
|
}
|
|
}
|
|
$command->setAliases($aliases);
|
|
|
|
break;
|
|
}
|
|
}
|
|
return $command;
|
|
}
|
|
/**
|
|
* Get the prefix from a command name or alias
|
|
*
|
|
* @param string $name The command name or alias
|
|
*
|
|
* @return string The prefix (empty if none)
|
|
*/
|
|
private static function getNamePrefix (string $name): string {
|
|
$lastPos = mb_strrpos($name, ':');
|
|
if ($lastPos === false) {
|
|
return '';
|
|
}
|
|
$prefix = mb_substr($name, 0, $lastPos);
|
|
if (mb_strlen($prefix) > 0) {
|
|
$prefix .= ':';
|
|
}
|
|
return $prefix;
|
|
}
|
|
} |