| | <?php |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | namespace think\console\input; |
| |
|
| | class Definition |
| | { |
| |
|
| | |
| | |
| | |
| | private $arguments; |
| |
|
| | private $requiredCount; |
| | private $hasAnArrayArgument = false; |
| | private $hasOptional; |
| |
|
| | |
| | |
| | |
| | private $options; |
| | private $shortcuts; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function __construct(array $definition = []) |
| | { |
| | $this->setDefinition($definition); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | public function setDefinition(array $definition) |
| | { |
| | $arguments = []; |
| | $options = []; |
| | foreach ($definition as $item) { |
| | if ($item instanceof Option) { |
| | $options[] = $item; |
| | } else { |
| | $arguments[] = $item; |
| | } |
| | } |
| |
|
| | $this->setArguments($arguments); |
| | $this->setOptions($options); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | public function setArguments($arguments = []) |
| | { |
| | $this->arguments = []; |
| | $this->requiredCount = 0; |
| | $this->hasOptional = false; |
| | $this->hasAnArrayArgument = false; |
| | $this->addArguments($arguments); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function addArguments($arguments = []) |
| | { |
| | if (null !== $arguments) { |
| | foreach ($arguments as $argument) { |
| | $this->addArgument($argument); |
| | } |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function addArgument(Argument $argument) |
| | { |
| | if (isset($this->arguments[$argument->getName()])) { |
| | throw new \LogicException(sprintf('An argument with name "%s" already exists.', $argument->getName())); |
| | } |
| |
|
| | if ($this->hasAnArrayArgument) { |
| | throw new \LogicException('Cannot add an argument after an array argument.'); |
| | } |
| |
|
| | if ($argument->isRequired() && $this->hasOptional) { |
| | throw new \LogicException('Cannot add a required argument after an optional one.'); |
| | } |
| |
|
| | if ($argument->isArray()) { |
| | $this->hasAnArrayArgument = true; |
| | } |
| |
|
| | if ($argument->isRequired()) { |
| | ++$this->requiredCount; |
| | } else { |
| | $this->hasOptional = true; |
| | } |
| |
|
| | $this->arguments[$argument->getName()] = $argument; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getArgument($name) |
| | { |
| | if (!$this->hasArgument($name)) { |
| | throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); |
| | } |
| |
|
| | $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments; |
| |
|
| | return $arguments[$name]; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function hasArgument($name) |
| | { |
| | $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments; |
| |
|
| | return isset($arguments[$name]); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | public function getArguments() |
| | { |
| | return $this->arguments; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | public function getArgumentCount() |
| | { |
| | return $this->hasAnArrayArgument ? PHP_INT_MAX : count($this->arguments); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | public function getArgumentRequiredCount() |
| | { |
| | return $this->requiredCount; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | public function getArgumentDefaults() |
| | { |
| | $values = []; |
| | foreach ($this->arguments as $argument) { |
| | $values[$argument->getName()] = $argument->getDefault(); |
| | } |
| |
|
| | return $values; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | public function setOptions($options = []) |
| | { |
| | $this->options = []; |
| | $this->shortcuts = []; |
| | $this->addOptions($options); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function addOptions($options = []) |
| | { |
| | foreach ($options as $option) { |
| | $this->addOption($option); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function addOption(Option $option) |
| | { |
| | if (isset($this->options[$option->getName()]) && !$option->equals($this->options[$option->getName()])) { |
| | throw new \LogicException(sprintf('An option named "%s" already exists.', $option->getName())); |
| | } |
| |
|
| | if ($option->getShortcut()) { |
| | foreach (explode('|', $option->getShortcut()) as $shortcut) { |
| | if (isset($this->shortcuts[$shortcut]) |
| | && !$option->equals($this->options[$this->shortcuts[$shortcut]]) |
| | ) { |
| | throw new \LogicException(sprintf('An option with shortcut "%s" already exists.', $shortcut)); |
| | } |
| | } |
| | } |
| |
|
| | $this->options[$option->getName()] = $option; |
| | if ($option->getShortcut()) { |
| | foreach (explode('|', $option->getShortcut()) as $shortcut) { |
| | $this->shortcuts[$shortcut] = $option->getName(); |
| | } |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getOption($name) |
| | { |
| | if (!$this->hasOption($name)) { |
| | throw new \InvalidArgumentException(sprintf('The "--%s" option does not exist.', $name)); |
| | } |
| |
|
| | return $this->options[$name]; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function hasOption($name) |
| | { |
| | return isset($this->options[$name]); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function getOptions() |
| | { |
| | return $this->options; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function hasShortcut($name) |
| | { |
| | return isset($this->shortcuts[$name]); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function getOptionForShortcut($shortcut) |
| | { |
| | return $this->getOption($this->shortcutToName($shortcut)); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | public function getOptionDefaults() |
| | { |
| | $values = []; |
| | foreach ($this->options as $option) { |
| | $values[$option->getName()] = $option->getDefault(); |
| | } |
| |
|
| | return $values; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | private function shortcutToName($shortcut) |
| | { |
| | if (!isset($this->shortcuts[$shortcut])) { |
| | throw new \InvalidArgumentException(sprintf('The "-%s" option does not exist.', $shortcut)); |
| | } |
| |
|
| | return $this->shortcuts[$shortcut]; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function getSynopsis($short = false) |
| | { |
| | $elements = []; |
| |
|
| | if ($short && $this->getOptions()) { |
| | $elements[] = '[options]'; |
| | } elseif (!$short) { |
| | foreach ($this->getOptions() as $option) { |
| | $value = ''; |
| | if ($option->acceptValue()) { |
| | $value = sprintf(' %s%s%s', $option->isValueOptional() ? '[' : '', strtoupper($option->getName()), $option->isValueOptional() ? ']' : ''); |
| | } |
| |
|
| | $shortcut = $option->getShortcut() ? sprintf('-%s|', $option->getShortcut()) : ''; |
| | $elements[] = sprintf('[%s--%s%s]', $shortcut, $option->getName(), $value); |
| | } |
| | } |
| |
|
| | if (count($elements) && $this->getArguments()) { |
| | $elements[] = '[--]'; |
| | } |
| |
|
| | foreach ($this->getArguments() as $argument) { |
| | $element = '<' . $argument->getName() . '>'; |
| | if (!$argument->isRequired()) { |
| | $element = '[' . $element . ']'; |
| | } elseif ($argument->isArray()) { |
| | $element .= ' (' . $element . ')'; |
| | } |
| |
|
| | if ($argument->isArray()) { |
| | $element .= '...'; |
| | } |
| |
|
| | $elements[] = $element; |
| | } |
| |
|
| | return implode(' ', $elements); |
| | } |
| | } |
| |
|