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.
109 lines
3.1 KiB
PHP
109 lines
3.1 KiB
PHP
<?php
|
|
|
|
namespace jrosset\CliProgram\CommandCall;
|
|
|
|
use Arrayy\Arrayy;
|
|
use jrosset\CliProgram\CliHelper;
|
|
use Symfony\Component\Console\Application;
|
|
use Symfony\Component\Console\Command\Command;
|
|
use Symfony\Component\Console\Input\ArrayInput;
|
|
use Symfony\Component\Console\Input\InputInterface;
|
|
use Symfony\Component\Console\Output\OutputInterface;
|
|
use Throwable;
|
|
|
|
/**
|
|
* A call to a command
|
|
*/
|
|
class CommandCall {
|
|
/**
|
|
* @var string The command name
|
|
*/
|
|
private string $commandName;
|
|
/**
|
|
* @var Arrayy<string, mixed> The command arguments
|
|
*/
|
|
private Arrayy $commandArguments;
|
|
|
|
/**
|
|
* @param string|class-string<Command>|Command $commandName The new command name
|
|
* @param null|Arrayy<string, mixed> $commandArguments The command new arguments
|
|
*/
|
|
public function __construct (string|Command $commandName, ?Arrayy $commandArguments = null) {
|
|
$this->setCommandName($commandName);
|
|
$this->setCommandArguments($commandArguments ?? new Arrayy());
|
|
}
|
|
|
|
/**
|
|
* Generate the input for the command call
|
|
*
|
|
* @return InputInterface Generate the input for the command call
|
|
*/
|
|
public function generateInput (): InputInterface {
|
|
return new ArrayInput(
|
|
(clone $this->getCommandArguments())
|
|
->prepend($this->getCommandName(), 'command')
|
|
->toArray()
|
|
);
|
|
}
|
|
/**
|
|
* Run the command
|
|
*
|
|
* @param Application $app The application
|
|
* @param OutputInterface $output The output
|
|
*
|
|
* @return int The command return code
|
|
*
|
|
* @throws Throwable If an error occurs
|
|
*/
|
|
public function run (Application $app, OutputInterface $output): int {
|
|
return $app->doRun($this->generateInput(), $output);
|
|
}
|
|
|
|
/**
|
|
* The command name
|
|
*
|
|
* @return string The command name
|
|
*/
|
|
public function getCommandName (): string {
|
|
return $this->commandName;
|
|
}
|
|
/**
|
|
* Set the command name
|
|
*
|
|
* @param string|class-string<Command>|Command $commandName The new command name
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setCommandName (string|Command $commandName): self {
|
|
if ($commandName instanceof Command) {
|
|
$this->commandName = CliHelper::getCommandNameFromClass($commandName->getApplication(), $commandName::class);
|
|
}
|
|
elseif (class_exists($commandName)) {
|
|
$this->commandName = CliHelper::getCommandNameFromClass($commandName->getApplication(), $commandName);
|
|
}
|
|
else {
|
|
$this->commandName = $commandName;
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* The command arguments
|
|
*
|
|
* @return Arrayy<string, mixed> The command arguments
|
|
*/
|
|
public function getCommandArguments (): Arrayy {
|
|
return $this->commandArguments;
|
|
}
|
|
/**
|
|
* Set the command arguments
|
|
*
|
|
* @param Arrayy<string, mixed> $commandArguments The command new arguments
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setCommandArguments (Arrayy $commandArguments): self {
|
|
$this->commandArguments = $commandArguments;
|
|
return $this;
|
|
}
|
|
} |