Subversion-Projekte lars-tiefland.laravel_shop

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
148 lars 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
 
12
namespace Symfony\Component\Console\Descriptor;
13
 
14
use Symfony\Component\Console\Application;
15
use Symfony\Component\Console\Command\Command;
16
use Symfony\Component\Console\Input\InputArgument;
17
use Symfony\Component\Console\Input\InputDefinition;
18
use Symfony\Component\Console\Input\InputOption;
19
 
20
/**
21
 * JSON descriptor.
22
 *
23
 * @author Jean-François Simon <contact@jfsimon.fr>
24
 *
25
 * @internal
26
 */
27
class JsonDescriptor extends Descriptor
28
{
29
    protected function describeInputArgument(InputArgument $argument, array $options = [])
30
    {
31
        $this->writeData($this->getInputArgumentData($argument), $options);
32
    }
33
 
34
    protected function describeInputOption(InputOption $option, array $options = [])
35
    {
36
        $this->writeData($this->getInputOptionData($option), $options);
37
        if ($option->isNegatable()) {
38
            $this->writeData($this->getInputOptionData($option, true), $options);
39
        }
40
    }
41
 
42
    protected function describeInputDefinition(InputDefinition $definition, array $options = [])
43
    {
44
        $this->writeData($this->getInputDefinitionData($definition), $options);
45
    }
46
 
47
    protected function describeCommand(Command $command, array $options = [])
48
    {
49
        $this->writeData($this->getCommandData($command, $options['short'] ?? false), $options);
50
    }
51
 
52
    protected function describeApplication(Application $application, array $options = [])
53
    {
54
        $describedNamespace = $options['namespace'] ?? null;
55
        $description = new ApplicationDescription($application, $describedNamespace, true);
56
        $commands = [];
57
 
58
        foreach ($description->getCommands() as $command) {
59
            $commands[] = $this->getCommandData($command, $options['short'] ?? false);
60
        }
61
 
62
        $data = [];
63
        if ('UNKNOWN' !== $application->getName()) {
64
            $data['application']['name'] = $application->getName();
65
            if ('UNKNOWN' !== $application->getVersion()) {
66
                $data['application']['version'] = $application->getVersion();
67
            }
68
        }
69
 
70
        $data['commands'] = $commands;
71
 
72
        if ($describedNamespace) {
73
            $data['namespace'] = $describedNamespace;
74
        } else {
75
            $data['namespaces'] = array_values($description->getNamespaces());
76
        }
77
 
78
        $this->writeData($data, $options);
79
    }
80
 
81
    /**
82
     * Writes data as json.
83
     */
84
    private function writeData(array $data, array $options)
85
    {
86
        $flags = $options['json_encoding'] ?? 0;
87
 
88
        $this->write(json_encode($data, $flags));
89
    }
90
 
91
    private function getInputArgumentData(InputArgument $argument): array
92
    {
93
        return [
94
            'name' => $argument->getName(),
95
            'is_required' => $argument->isRequired(),
96
            'is_array' => $argument->isArray(),
97
            'description' => preg_replace('/\s*[\r\n]\s*/', ' ', $argument->getDescription()),
98
            'default' => \INF === $argument->getDefault() ? 'INF' : $argument->getDefault(),
99
        ];
100
    }
101
 
102
    private function getInputOptionData(InputOption $option, bool $negated = false): array
103
    {
104
        return $negated ? [
105
            'name' => '--no-'.$option->getName(),
106
            'shortcut' => '',
107
            'accept_value' => false,
108
            'is_value_required' => false,
109
            'is_multiple' => false,
110
            'description' => 'Negate the "--'.$option->getName().'" option',
111
            'default' => false,
112
        ] : [
113
            'name' => '--'.$option->getName(),
114
            'shortcut' => $option->getShortcut() ? '-'.str_replace('|', '|-', $option->getShortcut()) : '',
115
            'accept_value' => $option->acceptValue(),
116
            'is_value_required' => $option->isValueRequired(),
117
            'is_multiple' => $option->isArray(),
118
            'description' => preg_replace('/\s*[\r\n]\s*/', ' ', $option->getDescription()),
119
            'default' => \INF === $option->getDefault() ? 'INF' : $option->getDefault(),
120
        ];
121
    }
122
 
123
    private function getInputDefinitionData(InputDefinition $definition): array
124
    {
125
        $inputArguments = [];
126
        foreach ($definition->getArguments() as $name => $argument) {
127
            $inputArguments[$name] = $this->getInputArgumentData($argument);
128
        }
129
 
130
        $inputOptions = [];
131
        foreach ($definition->getOptions() as $name => $option) {
132
            $inputOptions[$name] = $this->getInputOptionData($option);
133
            if ($option->isNegatable()) {
134
                $inputOptions['no-'.$name] = $this->getInputOptionData($option, true);
135
            }
136
        }
137
 
138
        return ['arguments' => $inputArguments, 'options' => $inputOptions];
139
    }
140
 
141
    private function getCommandData(Command $command, bool $short = false): array
142
    {
143
        $data = [
144
            'name' => $command->getName(),
145
            'description' => $command->getDescription(),
146
        ];
147
 
148
        if ($short) {
149
            $data += [
150
                'usage' => $command->getAliases(),
151
            ];
152
        } else {
153
            $command->mergeApplicationDefinition(false);
154
 
155
            $data += [
156
                'usage' => array_merge([$command->getSynopsis()], $command->getUsages(), $command->getAliases()),
157
                'help' => $command->getProcessedHelp(),
158
                'definition' => $this->getInputDefinitionData($command->getDefinition()),
159
            ];
160
        }
161
 
162
        $data['hidden'] = $command->isHidden();
163
 
164
        return $data;
165
    }
166
}