52 lines
1.7 KiB
PHP
52 lines
1.7 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Symfony package.
|
|
*
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Symfony\Component\Console\Interaction;
|
|
|
|
use Symfony\Component\Console\Attribute\InteractiveAttributeInterface;
|
|
use Symfony\Component\Console\Attribute\MapInput;
|
|
use Symfony\Component\Console\Input\InputInterface;
|
|
use Symfony\Component\Console\Output\OutputInterface;
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
final class Interaction
|
|
{
|
|
public function __construct(
|
|
private readonly object $owner,
|
|
private readonly InteractiveAttributeInterface $attribute,
|
|
) {
|
|
}
|
|
|
|
/**
|
|
* @param \Closure(\ReflectionFunction $function, InputInterface $input, OutputInterface $output): array $parameterResolver
|
|
*/
|
|
public function interact(InputInterface $input, OutputInterface $output, \Closure $parameterResolver): void
|
|
{
|
|
if ($this->owner instanceof MapInput) {
|
|
$function = $this->attribute->getFunction($this->owner->resolveValue($input));
|
|
$function->invoke(...$parameterResolver($function, $input, $output));
|
|
$this->owner->setValue($input, $function->getClosureThis());
|
|
|
|
return;
|
|
}
|
|
|
|
$function = $this->attribute->getFunction($this->owner);
|
|
$function->invoke(...$args = $parameterResolver($function, $input, $output));
|
|
foreach ($function->getParameters() as $i => $parameter) {
|
|
if (\is_object($args[$i]) && $spec = MapInput::tryFrom($parameter)) {
|
|
$spec->setValue($input, $args[$i]);
|
|
}
|
|
}
|
|
}
|
|
}
|