diff --git a/src/CliProgram/CommandCall/CommandArgumentList.php b/src/CliProgram/CommandCall/CommandArgumentList.php index e980863..5b7e190 100644 --- a/src/CliProgram/CommandCall/CommandArgumentList.php +++ b/src/CliProgram/CommandCall/CommandArgumentList.php @@ -2,7 +2,7 @@ namespace jrosset\CliProgram\CommandCall; -use Traversable; +use Symfony\Component\Console\Input\InputInterface; /** * A list of arguments for a command call @@ -16,9 +16,9 @@ class CommandArgumentList { /** * Initialization * - * @param Traversable|null $arguments The arguments + * @param iterable|null $arguments The arguments */ - public function __construct (?Traversable $arguments = null) { + public function __construct (?iterable $arguments = null) { $this->arguments = []; if ($arguments !== null) { foreach ($arguments as $name => $value) { @@ -27,6 +27,62 @@ class CommandArgumentList { } } + /** + * Create a list of arguments from {@see InputInterface} + * + * @param InputInterface $input The input interface + * @param bool $keepCommandName Keep the command name in the list of arguments? + * + * @return static The list of arguments + */ + public static function fromInputInterface (InputInterface $input, bool $keepCommandName = false): static { + $args = new static(); + //region Recopie arguments + foreach ($input->getArguments() as $argumentName => $argumentValue) { + //region Recopie des arguments par défaut de Symfony + if ($argumentName == 'command' && !$keepCommandName) { + continue; + } + //endregion + $args->addArgument($argumentName, $argumentValue); + } + //endregion + //region Recopie options + foreach ($input->getOptions() as $optionName => $optionValue) { + //region Recopie des options par défaut de Symfony + if (in_array($optionName, ['help', 'quiet', 'version', 'no-interaction']) && $optionValue === false) { + // Symfony se contente de regarder si le nom de l'option est donné, peu importe sa valeur, donc ils ne sont pas recopiés si à faux + continue; + } + if ($optionName == 'ansi' && $optionValue === null) { + // Symfony se contente de regarder si le nom de l'option est donné, peu importe sa valeur, donc n'est pas recopié si aucune valeur + continue; + } + if ($optionName == 'verbose') { + // Pour la verbosité, $input->getOptions() se contente de signaler "verbose" = "vrai" sans tenir compte du niveau de verbosité + // Donc on doit tester tous les cas un par un (et ne rien recopier si pas de verbosité) + // Teste du plus verbeux au moins verbeux car "-vv" matche si "-vvv" transmis + if ($input->hasParameterOption('-vvv')) { + $args->addOption('-vvv'); + } + elseif ($input->hasParameterOption('-vv')) { + $args->addOption('-vv'); + } + elseif ($input->hasParameterOption('-v')) { + $args->addOption('-v'); + } + elseif ($optionValue === true) { + $args->addOption('verbose'); + } + continue; + } + //endregion + $args->addOption($optionName, $optionValue); + } + //endregion + return $args; + } + /** * The arguments *