Lines 100.00% 24 / 24
Methods 100.00% 10 / 10
Classes 100.00% 1 / 1
Name Lines Methods CRAP
 __construct 100.00% 1 / 1 100.00% 1 / 1 1
 configure 100.00% 5 / 5 100.00% 1 / 1 1
 resolveControlTarget 100.00% 6 / 6 100.00% 1 / 1 1
 writeCommandResult 100.00% 3 / 3 100.00% 1 / 1 2
 parseTimeoutOption 100.00% 1 / 1 100.00% 1 / 1 1
 [Stewart\Runtime\Console\StewartCommand] findConfigOption 100.00% 1 / 1 100.00% 1 / 1 1
 [Stewart\Runtime\Console\StewartCommand] nonEmptyStringOption 100.00% 2 / 2 100.00% 1 / 1 3
 [Stewart\Runtime\Console\StewartCommand] writeMissingConfigFileNotice 100.00% 2 / 2 100.00% 1 / 1 2
 [Stewart\Runtime\Console\StewartCommand] writeNotice 100.00% 1 / 1 100.00% 1 / 1 2
 [Stewart\Runtime\Console\StewartCommand] readStringArgument 100.00% 2 / 2 100.00% 1 / 1 2
18abstract class ControlCommand extends StewartCommand
19{
20    private const string DEFAULT_TIMEOUT = '5s';
21
22    public function __construct(
23        private readonly ConfigLoader $config,
24        private readonly ControlTargetResolver $targets,
25    ) {
26        parent::__construct();
27    }
28
29    protected function configure(): void
30    {
31        parent::configure();
32        $this
33            ->addOption('address', null, InputOption::VALUE_REQUIRED, 'Where the daemon listens, such as unix://var/run/stewart.sock or tcp://host:port; defaults to control.listen')
34            ->addOption('token', null, InputOption::VALUE_REQUIRED, 'The control token; defaults to control.token, usually STEWART_CONTROL__TOKEN')
35            ->addOption('timeout', null, InputOption::VALUE_REQUIRED, 'How long to wait for the daemon, like 5s', self::DEFAULT_TIMEOUT);
36    }
37
38    /** @throws StewartException */
39    protected function resolveControlTarget(InputInterface $input): ControlTarget
40    {
41        $path = $this->findConfigOption($input);
42
43        return $this->targets->resolveTarget(
44            $this->nonEmptyStringOption($input, 'address'),
45            $this->nonEmptyStringOption($input, 'token'),
46            fn(): ControlConfig => $this->config->loadConfig($path)->control,
47        );
48    }
49
50    protected function writeCommandResult(OutputInterface $output, CommandResult $result): void
51    {
52        $output->writeln($result->message);
53
54        if ($result->warning !== null) {
55            $this->writeNotice($output, $result->warning);
56        }
57    }
58
59    /** @throws StewartException */
60    protected function parseTimeoutOption(InputInterface $input): Duration
61    {
62        return Duration::parse($this->nonEmptyStringOption($input, 'timeout') ?? self::DEFAULT_TIMEOUT);
63    }
64}

Inherited from Stewart\Runtime\Console\StewartCommand

20    protected function findConfigOption(InputInterface $input): ?string
21    {
22        return $this->nonEmptyStringOption($input, 'config');
23    }
25    protected function nonEmptyStringOption(InputInterface $input, string $name): ?string
26    {
27        $value = $input->getOption($name);
28
29        return \is_string($value) && $value !== '' ? $value : null;
30    }
32    protected function writeMissingConfigFileNotice(OutputInterface $output, ?string $missingConfigFile): void
33    {
34        if ($missingConfigFile !== null) {
35            $this->writeNotice($output, \sprintf('No config file at %s; using the environment only.', $missingConfigFile));
36        }
37    }
39    protected function writeNotice(OutputInterface $output, string $notice): void
40    {
41        ($output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output)->writeln('<comment>' . $notice . '</comment>');
42    }
44    protected function readStringArgument(InputInterface $input, string $name): string
45    {
46        $value = $input->getArgument($name);
47
48        return \is_string($value) ? $value : '';
49    }