@ -5,9 +5,13 @@ namespace jrosset\CliProgram\Validation;
use Closure;
use Closure;
use jrosset\CliProgram\Validation\Validators\InvalidValueException;
use jrosset\CliProgram\Validation\Validators\InvalidValueException;
use jrosset\CliProgram\Validation\Validators\IValidator;
use jrosset\CliProgram\Validation\Validators\IValidator;
use jrosset\CliProgram\Validation\Validators\IValidatorWithSuggestions;
use ReflectionFunction;
use ReflectionFunction;
use Stringable;
use Stringable;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Completion\Suggestion;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputInterface;
@ -188,12 +192,12 @@ trait TCommandWithValidation {
/**
/**
* Adds an argument
* Adds an argument
*
*
* @param string $name The argument name
* @param string $name The argument name
* @param int|null $mode The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL
* @param int|null $mode The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL
* @param mixed $default The default value (for InputArgument::OPTIONAL mode only)
* @param mixed $default The default value (for InputArgument::OPTIONAL mode only)
* @param string $description The argument description
* @param string $description The argument description
* @param IValidator|null $validator The validator or Null if none
* @param IValidator|null $validator The validator or Null if none
* @param Closure|array|null $suggestedValues The function or list of suggested values when completing ; Null if none
* @param null|(string|Suggestion)[]|Closure(CompletionInput,CompletionSuggestions):list< string | Suggestion > $suggestedValues The function or list of suggested values when completing ; Null if none
*
*
* @return $this
* @return $this
*
*
@ -210,14 +214,13 @@ trait TCommandWithValidation {
$default = static::treatStringableDefaultValue($default);
$default = static::treatStringableDefaultValue($default);
if ($validator !== null) {
if ($validator !== null) {
$default = $validator->getValidDefault($default);
$default = $validator->getValidDefault($default);
if ($validator instanceof IValidatorWithSuggestions) {
$suggestedValues ??= $validator->getSuggestions();
}
}
}
$suggestedValues ??= [];
if ($suggestedValues !== null) {
parent::addArgument($name, $mode, $description, $default, $suggestedValues);
parent::addArgument($name, $mode, $description, $default, $suggestedValues);
}
else {
parent::addArgument($name, $mode, $description, $default);
}
return $this->setArgumentValidator($name, $validator);
return $this->setArgumentValidator($name, $validator);
}
}
/**
/**
@ -284,14 +287,13 @@ trait TCommandWithValidation {
$default = static::treatStringableDefaultValue($default);
$default = static::treatStringableDefaultValue($default);
if ($validator !== null) {
if ($validator !== null) {
$default = $validator->getValidDefault($default);
$default = $validator->getValidDefault($default);
if ($validator instanceof IValidatorWithSuggestions) {
$suggestedValues ??= $validator->getSuggestions();
}
}
}
$suggestedValues ??= [];
if ($suggestedValues !== null) {
parent::addOption($name, $shortcut, $mode, $description, $default, $suggestedValues);
parent::addOption($name, $shortcut, $mode, $description, $default, $suggestedValues);
}
else {
parent::addOption($name, $shortcut, $mode, $description, $default);
}
return $this->setOptionValidator($name, $validator);
return $this->setOptionValidator($name, $validator);
}
}
/**
/**