Add CommandCall

master 3.4.0
Julien Rosset 2 years ago
parent 6258c680df
commit 6643ce813c

@ -2,8 +2,12 @@
namespace jrosset\CliProgram;
use jrosset\CliProgram\CommandCall\CommandCall;
use jrosset\CliProgram\CommandCall\CommandCallsList;
use ReflectionClass;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Output\OutputInterface;
use Throwable;
/**
* A basic command
@ -24,4 +28,31 @@ class BaseCommand extends Command {
parent::__construct($name);
$this->setAliases($aliases);
}
/**
* Run a list of subcommands
*
* Stop à the first subcommand returning other than {@see Command::SUCCESS}
*
* @param CommandCallsList|CommandCall $subcommandList The subcommands to run
* @param OutputInterface $output The output
*
* @return int The last executed subcommand return code
*
* @throws Throwable If an error occurs
*/
public function runSubCommands (CommandCallsList|CommandCall $subcommandList, OutputInterface $output): int {
if (!$subcommandList instanceof CommandCallsList) {
$subcommandList = new CommandCallsList([$subcommandList]);
}
/** @var CommandCall $subcommand */
foreach ($subcommandList as $subcommand) {
if (($returnCode = $subcommand->run($this->getApplication(), $output)) !== Command::SUCCESS) {
return $returnCode;
}
}
return Command::SUCCESS;
}
}

@ -0,0 +1,100 @@
<?php
namespace jrosset\CliProgram\CommandCall;
use Arrayy\Arrayy;
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|Command $commandName The new command name
* @param null|Arrayy<string, mixed> $commandArguments The command new arguments
*/
public function __construct (string|Command $commandName, ?Arrayy $commandArguments) {
$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|Command $commandName The new command name
*
* @return $this
*/
public function setCommandName (string|Command $commandName): self {
$this->commandName = $commandName instanceof Command ? $commandName->getName() : $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;
}
}

@ -0,0 +1,19 @@
<?php
namespace jrosset\CliProgram\CommandCall;
use Arrayy\Collection\AbstractCollection;
/**
* A list of calls to a command
*
* @extends AbstractCollection<CommandCall>
*/
class CommandCallsList extends AbstractCollection {
/**
* @inheritDoc
*/
public function getType (): string {
return CommandCall::class;
}
}
Loading…
Cancel
Save