Mercurial > hg > isophonics-drupal-site
comparison vendor/symfony/console/Input/InputDefinition.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 1fec387a4317 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4c8ae668cc8c |
---|---|
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\Input; | |
13 | |
14 use Symfony\Component\Console\Exception\InvalidArgumentException; | |
15 use Symfony\Component\Console\Exception\LogicException; | |
16 | |
17 /** | |
18 * A InputDefinition represents a set of valid command line arguments and options. | |
19 * | |
20 * Usage: | |
21 * | |
22 * $definition = new InputDefinition(array( | |
23 * new InputArgument('name', InputArgument::REQUIRED), | |
24 * new InputOption('foo', 'f', InputOption::VALUE_REQUIRED), | |
25 * )); | |
26 * | |
27 * @author Fabien Potencier <fabien@symfony.com> | |
28 */ | |
29 class InputDefinition | |
30 { | |
31 private $arguments; | |
32 private $requiredCount; | |
33 private $hasAnArrayArgument = false; | |
34 private $hasOptional; | |
35 private $options; | |
36 private $shortcuts; | |
37 | |
38 /** | |
39 * Constructor. | |
40 * | |
41 * @param array $definition An array of InputArgument and InputOption instance | |
42 */ | |
43 public function __construct(array $definition = array()) | |
44 { | |
45 $this->setDefinition($definition); | |
46 } | |
47 | |
48 /** | |
49 * Sets the definition of the input. | |
50 * | |
51 * @param array $definition The definition array | |
52 */ | |
53 public function setDefinition(array $definition) | |
54 { | |
55 $arguments = array(); | |
56 $options = array(); | |
57 foreach ($definition as $item) { | |
58 if ($item instanceof InputOption) { | |
59 $options[] = $item; | |
60 } else { | |
61 $arguments[] = $item; | |
62 } | |
63 } | |
64 | |
65 $this->setArguments($arguments); | |
66 $this->setOptions($options); | |
67 } | |
68 | |
69 /** | |
70 * Sets the InputArgument objects. | |
71 * | |
72 * @param InputArgument[] $arguments An array of InputArgument objects | |
73 */ | |
74 public function setArguments($arguments = array()) | |
75 { | |
76 $this->arguments = array(); | |
77 $this->requiredCount = 0; | |
78 $this->hasOptional = false; | |
79 $this->hasAnArrayArgument = false; | |
80 $this->addArguments($arguments); | |
81 } | |
82 | |
83 /** | |
84 * Adds an array of InputArgument objects. | |
85 * | |
86 * @param InputArgument[] $arguments An array of InputArgument objects | |
87 */ | |
88 public function addArguments($arguments = array()) | |
89 { | |
90 if (null !== $arguments) { | |
91 foreach ($arguments as $argument) { | |
92 $this->addArgument($argument); | |
93 } | |
94 } | |
95 } | |
96 | |
97 /** | |
98 * Adds an InputArgument object. | |
99 * | |
100 * @param InputArgument $argument An InputArgument object | |
101 * | |
102 * @throws LogicException When incorrect argument is given | |
103 */ | |
104 public function addArgument(InputArgument $argument) | |
105 { | |
106 if (isset($this->arguments[$argument->getName()])) { | |
107 throw new LogicException(sprintf('An argument with name "%s" already exists.', $argument->getName())); | |
108 } | |
109 | |
110 if ($this->hasAnArrayArgument) { | |
111 throw new LogicException('Cannot add an argument after an array argument.'); | |
112 } | |
113 | |
114 if ($argument->isRequired() && $this->hasOptional) { | |
115 throw new LogicException('Cannot add a required argument after an optional one.'); | |
116 } | |
117 | |
118 if ($argument->isArray()) { | |
119 $this->hasAnArrayArgument = true; | |
120 } | |
121 | |
122 if ($argument->isRequired()) { | |
123 ++$this->requiredCount; | |
124 } else { | |
125 $this->hasOptional = true; | |
126 } | |
127 | |
128 $this->arguments[$argument->getName()] = $argument; | |
129 } | |
130 | |
131 /** | |
132 * Returns an InputArgument by name or by position. | |
133 * | |
134 * @param string|int $name The InputArgument name or position | |
135 * | |
136 * @return InputArgument An InputArgument object | |
137 * | |
138 * @throws InvalidArgumentException When argument given doesn't exist | |
139 */ | |
140 public function getArgument($name) | |
141 { | |
142 if (!$this->hasArgument($name)) { | |
143 throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); | |
144 } | |
145 | |
146 $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments; | |
147 | |
148 return $arguments[$name]; | |
149 } | |
150 | |
151 /** | |
152 * Returns true if an InputArgument object exists by name or position. | |
153 * | |
154 * @param string|int $name The InputArgument name or position | |
155 * | |
156 * @return bool true if the InputArgument object exists, false otherwise | |
157 */ | |
158 public function hasArgument($name) | |
159 { | |
160 $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments; | |
161 | |
162 return isset($arguments[$name]); | |
163 } | |
164 | |
165 /** | |
166 * Gets the array of InputArgument objects. | |
167 * | |
168 * @return InputArgument[] An array of InputArgument objects | |
169 */ | |
170 public function getArguments() | |
171 { | |
172 return $this->arguments; | |
173 } | |
174 | |
175 /** | |
176 * Returns the number of InputArguments. | |
177 * | |
178 * @return int The number of InputArguments | |
179 */ | |
180 public function getArgumentCount() | |
181 { | |
182 return $this->hasAnArrayArgument ? PHP_INT_MAX : count($this->arguments); | |
183 } | |
184 | |
185 /** | |
186 * Returns the number of required InputArguments. | |
187 * | |
188 * @return int The number of required InputArguments | |
189 */ | |
190 public function getArgumentRequiredCount() | |
191 { | |
192 return $this->requiredCount; | |
193 } | |
194 | |
195 /** | |
196 * Gets the default values. | |
197 * | |
198 * @return array An array of default values | |
199 */ | |
200 public function getArgumentDefaults() | |
201 { | |
202 $values = array(); | |
203 foreach ($this->arguments as $argument) { | |
204 $values[$argument->getName()] = $argument->getDefault(); | |
205 } | |
206 | |
207 return $values; | |
208 } | |
209 | |
210 /** | |
211 * Sets the InputOption objects. | |
212 * | |
213 * @param InputOption[] $options An array of InputOption objects | |
214 */ | |
215 public function setOptions($options = array()) | |
216 { | |
217 $this->options = array(); | |
218 $this->shortcuts = array(); | |
219 $this->addOptions($options); | |
220 } | |
221 | |
222 /** | |
223 * Adds an array of InputOption objects. | |
224 * | |
225 * @param InputOption[] $options An array of InputOption objects | |
226 */ | |
227 public function addOptions($options = array()) | |
228 { | |
229 foreach ($options as $option) { | |
230 $this->addOption($option); | |
231 } | |
232 } | |
233 | |
234 /** | |
235 * Adds an InputOption object. | |
236 * | |
237 * @param InputOption $option An InputOption object | |
238 * | |
239 * @throws LogicException When option given already exist | |
240 */ | |
241 public function addOption(InputOption $option) | |
242 { | |
243 if (isset($this->options[$option->getName()]) && !$option->equals($this->options[$option->getName()])) { | |
244 throw new LogicException(sprintf('An option named "%s" already exists.', $option->getName())); | |
245 } | |
246 | |
247 if ($option->getShortcut()) { | |
248 foreach (explode('|', $option->getShortcut()) as $shortcut) { | |
249 if (isset($this->shortcuts[$shortcut]) && !$option->equals($this->options[$this->shortcuts[$shortcut]])) { | |
250 throw new LogicException(sprintf('An option with shortcut "%s" already exists.', $shortcut)); | |
251 } | |
252 } | |
253 } | |
254 | |
255 $this->options[$option->getName()] = $option; | |
256 if ($option->getShortcut()) { | |
257 foreach (explode('|', $option->getShortcut()) as $shortcut) { | |
258 $this->shortcuts[$shortcut] = $option->getName(); | |
259 } | |
260 } | |
261 } | |
262 | |
263 /** | |
264 * Returns an InputOption by name. | |
265 * | |
266 * @param string $name The InputOption name | |
267 * | |
268 * @return InputOption A InputOption object | |
269 * | |
270 * @throws InvalidArgumentException When option given doesn't exist | |
271 */ | |
272 public function getOption($name) | |
273 { | |
274 if (!$this->hasOption($name)) { | |
275 throw new InvalidArgumentException(sprintf('The "--%s" option does not exist.', $name)); | |
276 } | |
277 | |
278 return $this->options[$name]; | |
279 } | |
280 | |
281 /** | |
282 * Returns true if an InputOption object exists by name. | |
283 * | |
284 * This method can't be used to check if the user included the option when | |
285 * executing the command (use getOption() instead). | |
286 * | |
287 * @param string $name The InputOption name | |
288 * | |
289 * @return bool true if the InputOption object exists, false otherwise | |
290 */ | |
291 public function hasOption($name) | |
292 { | |
293 return isset($this->options[$name]); | |
294 } | |
295 | |
296 /** | |
297 * Gets the array of InputOption objects. | |
298 * | |
299 * @return InputOption[] An array of InputOption objects | |
300 */ | |
301 public function getOptions() | |
302 { | |
303 return $this->options; | |
304 } | |
305 | |
306 /** | |
307 * Returns true if an InputOption object exists by shortcut. | |
308 * | |
309 * @param string $name The InputOption shortcut | |
310 * | |
311 * @return bool true if the InputOption object exists, false otherwise | |
312 */ | |
313 public function hasShortcut($name) | |
314 { | |
315 return isset($this->shortcuts[$name]); | |
316 } | |
317 | |
318 /** | |
319 * Gets an InputOption by shortcut. | |
320 * | |
321 * @param string $shortcut the Shortcut name | |
322 * | |
323 * @return InputOption An InputOption object | |
324 */ | |
325 public function getOptionForShortcut($shortcut) | |
326 { | |
327 return $this->getOption($this->shortcutToName($shortcut)); | |
328 } | |
329 | |
330 /** | |
331 * Gets an array of default values. | |
332 * | |
333 * @return array An array of all default values | |
334 */ | |
335 public function getOptionDefaults() | |
336 { | |
337 $values = array(); | |
338 foreach ($this->options as $option) { | |
339 $values[$option->getName()] = $option->getDefault(); | |
340 } | |
341 | |
342 return $values; | |
343 } | |
344 | |
345 /** | |
346 * Returns the InputOption name given a shortcut. | |
347 * | |
348 * @param string $shortcut The shortcut | |
349 * | |
350 * @return string The InputOption name | |
351 * | |
352 * @throws InvalidArgumentException When option given does not exist | |
353 */ | |
354 private function shortcutToName($shortcut) | |
355 { | |
356 if (!isset($this->shortcuts[$shortcut])) { | |
357 throw new InvalidArgumentException(sprintf('The "-%s" option does not exist.', $shortcut)); | |
358 } | |
359 | |
360 return $this->shortcuts[$shortcut]; | |
361 } | |
362 | |
363 /** | |
364 * Gets the synopsis. | |
365 * | |
366 * @param bool $short Whether to return the short version (with options folded) or not | |
367 * | |
368 * @return string The synopsis | |
369 */ | |
370 public function getSynopsis($short = false) | |
371 { | |
372 $elements = array(); | |
373 | |
374 if ($short && $this->getOptions()) { | |
375 $elements[] = '[options]'; | |
376 } elseif (!$short) { | |
377 foreach ($this->getOptions() as $option) { | |
378 $value = ''; | |
379 if ($option->acceptValue()) { | |
380 $value = sprintf( | |
381 ' %s%s%s', | |
382 $option->isValueOptional() ? '[' : '', | |
383 strtoupper($option->getName()), | |
384 $option->isValueOptional() ? ']' : '' | |
385 ); | |
386 } | |
387 | |
388 $shortcut = $option->getShortcut() ? sprintf('-%s|', $option->getShortcut()) : ''; | |
389 $elements[] = sprintf('[%s--%s%s]', $shortcut, $option->getName(), $value); | |
390 } | |
391 } | |
392 | |
393 if (count($elements) && $this->getArguments()) { | |
394 $elements[] = '[--]'; | |
395 } | |
396 | |
397 foreach ($this->getArguments() as $argument) { | |
398 $element = '<'.$argument->getName().'>'; | |
399 if (!$argument->isRequired()) { | |
400 $element = '['.$element.']'; | |
401 } elseif ($argument->isArray()) { | |
402 $element = $element.' ('.$element.')'; | |
403 } | |
404 | |
405 if ($argument->isArray()) { | |
406 $element .= '...'; | |
407 } | |
408 | |
409 $elements[] = $element; | |
410 } | |
411 | |
412 return implode(' ', $elements); | |
413 } | |
414 } |