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.
PhpCliProgram/src/CliProgram/CommandCall/CommandCall.php

100 lines
2.7 KiB
PHP

<?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;
}
}