ApplicationDescription.php
1 year ago
Descriptor.php
1 year ago
DescriptorInterface.php
2 years ago
JsonDescriptor.php
1 year ago
MarkdownDescriptor.php
1 year ago
TextDescriptor.php
1 year ago
XmlDescriptor.php
1 year ago
JsonDescriptor.php
128 lines
| 1 | <?php |
| 2 | |
| 3 | /* |
| 4 | * This file is part of the Symfony package. |
| 5 | * |
| 6 | * (c) Fabien Potencier <fabien@symfony.com> |
| 7 | * |
| 8 | * For the full copyright and license information, please view the LICENSE |
| 9 | * file that was distributed with this source code. |
| 10 | */ |
| 11 | namespace Matomo\Dependencies\Symfony\Component\Console\Descriptor; |
| 12 | |
| 13 | use Matomo\Dependencies\Symfony\Component\Console\Application; |
| 14 | use Matomo\Dependencies\Symfony\Component\Console\Command\Command; |
| 15 | use Matomo\Dependencies\Symfony\Component\Console\Input\InputArgument; |
| 16 | use Matomo\Dependencies\Symfony\Component\Console\Input\InputDefinition; |
| 17 | use Matomo\Dependencies\Symfony\Component\Console\Input\InputOption; |
| 18 | /** |
| 19 | * JSON descriptor. |
| 20 | * |
| 21 | * @author Jean-François Simon <contact@jfsimon.fr> |
| 22 | * |
| 23 | * @internal |
| 24 | */ |
| 25 | class JsonDescriptor extends Descriptor |
| 26 | { |
| 27 | /** |
| 28 | * {@inheritdoc} |
| 29 | */ |
| 30 | protected function describeInputArgument(InputArgument $argument, array $options = []) |
| 31 | { |
| 32 | $this->writeData($this->getInputArgumentData($argument), $options); |
| 33 | } |
| 34 | /** |
| 35 | * {@inheritdoc} |
| 36 | */ |
| 37 | protected function describeInputOption(InputOption $option, array $options = []) |
| 38 | { |
| 39 | $this->writeData($this->getInputOptionData($option), $options); |
| 40 | if ($option->isNegatable()) { |
| 41 | $this->writeData($this->getInputOptionData($option, \true), $options); |
| 42 | } |
| 43 | } |
| 44 | /** |
| 45 | * {@inheritdoc} |
| 46 | */ |
| 47 | protected function describeInputDefinition(InputDefinition $definition, array $options = []) |
| 48 | { |
| 49 | $this->writeData($this->getInputDefinitionData($definition), $options); |
| 50 | } |
| 51 | /** |
| 52 | * {@inheritdoc} |
| 53 | */ |
| 54 | protected function describeCommand(Command $command, array $options = []) |
| 55 | { |
| 56 | $this->writeData($this->getCommandData($command, $options['short'] ?? \false), $options); |
| 57 | } |
| 58 | /** |
| 59 | * {@inheritdoc} |
| 60 | */ |
| 61 | protected function describeApplication(Application $application, array $options = []) |
| 62 | { |
| 63 | $describedNamespace = $options['namespace'] ?? null; |
| 64 | $description = new ApplicationDescription($application, $describedNamespace, \true); |
| 65 | $commands = []; |
| 66 | foreach ($description->getCommands() as $command) { |
| 67 | $commands[] = $this->getCommandData($command, $options['short'] ?? \false); |
| 68 | } |
| 69 | $data = []; |
| 70 | if ('UNKNOWN' !== $application->getName()) { |
| 71 | $data['application']['name'] = $application->getName(); |
| 72 | if ('UNKNOWN' !== $application->getVersion()) { |
| 73 | $data['application']['version'] = $application->getVersion(); |
| 74 | } |
| 75 | } |
| 76 | $data['commands'] = $commands; |
| 77 | if ($describedNamespace) { |
| 78 | $data['namespace'] = $describedNamespace; |
| 79 | } else { |
| 80 | $data['namespaces'] = array_values($description->getNamespaces()); |
| 81 | } |
| 82 | $this->writeData($data, $options); |
| 83 | } |
| 84 | /** |
| 85 | * Writes data as json. |
| 86 | */ |
| 87 | private function writeData(array $data, array $options) |
| 88 | { |
| 89 | $flags = $options['json_encoding'] ?? 0; |
| 90 | $this->write(json_encode($data, $flags)); |
| 91 | } |
| 92 | private function getInputArgumentData(InputArgument $argument) : array |
| 93 | { |
| 94 | return ['name' => $argument->getName(), 'is_required' => $argument->isRequired(), 'is_array' => $argument->isArray(), 'description' => preg_replace('/\\s*[\\r\\n]\\s*/', ' ', $argument->getDescription()), 'default' => \INF === $argument->getDefault() ? 'INF' : $argument->getDefault()]; |
| 95 | } |
| 96 | private function getInputOptionData(InputOption $option, bool $negated = \false) : array |
| 97 | { |
| 98 | return $negated ? ['name' => '--no-' . $option->getName(), 'shortcut' => '', 'accept_value' => \false, 'is_value_required' => \false, 'is_multiple' => \false, 'description' => 'Negate the "--' . $option->getName() . '" option', 'default' => \false] : ['name' => '--' . $option->getName(), 'shortcut' => $option->getShortcut() ? '-' . str_replace('|', '|-', $option->getShortcut()) : '', 'accept_value' => $option->acceptValue(), 'is_value_required' => $option->isValueRequired(), 'is_multiple' => $option->isArray(), 'description' => preg_replace('/\\s*[\\r\\n]\\s*/', ' ', $option->getDescription()), 'default' => \INF === $option->getDefault() ? 'INF' : $option->getDefault()]; |
| 99 | } |
| 100 | private function getInputDefinitionData(InputDefinition $definition) : array |
| 101 | { |
| 102 | $inputArguments = []; |
| 103 | foreach ($definition->getArguments() as $name => $argument) { |
| 104 | $inputArguments[$name] = $this->getInputArgumentData($argument); |
| 105 | } |
| 106 | $inputOptions = []; |
| 107 | foreach ($definition->getOptions() as $name => $option) { |
| 108 | $inputOptions[$name] = $this->getInputOptionData($option); |
| 109 | if ($option->isNegatable()) { |
| 110 | $inputOptions['no-' . $name] = $this->getInputOptionData($option, \true); |
| 111 | } |
| 112 | } |
| 113 | return ['arguments' => $inputArguments, 'options' => $inputOptions]; |
| 114 | } |
| 115 | private function getCommandData(Command $command, bool $short = \false) : array |
| 116 | { |
| 117 | $data = ['name' => $command->getName(), 'description' => $command->getDescription()]; |
| 118 | if ($short) { |
| 119 | $data += ['usage' => $command->getAliases()]; |
| 120 | } else { |
| 121 | $command->mergeApplicationDefinition(\false); |
| 122 | $data += ['usage' => array_merge([$command->getSynopsis()], $command->getUsages(), $command->getAliases()), 'help' => $command->getProcessedHelp(), 'definition' => $this->getInputDefinitionData($command->getDefinition())]; |
| 123 | } |
| 124 | $data['hidden'] = $command->isHidden(); |
| 125 | return $data; |
| 126 | } |
| 127 | } |
| 128 |