vendor/symfony/src/Symfony/Component/Console/Input/InputDefinition.php
author ymh <ymh.work@gmail.com>
Tue, 20 Mar 2012 12:40:58 +0100
changeset 81 ab53cabaeb0b
parent 0 7f95f8617b0b
permissions -rwxr-xr-x
uupgrade subrepo
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/*
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * This file is part of the Symfony package.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * (c) Fabien Potencier <fabien@symfony.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * For the full copyright and license information, please view the LICENSE
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 * file that was distributed with this source code.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
namespace Symfony\Component\Console\Input;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
/**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
 * A InputDefinition represents a set of valid command line arguments and options.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
 * Usage:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
 *     $definition = new InputDefinition(array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
 *       new InputArgument('name', InputArgument::REQUIRED),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
 *       new InputOption('foo', 'f', InputOption::VALUE_REQUIRED),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
 *     ));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
 * @author Fabien Potencier <fabien@symfony.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
 * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
class InputDefinition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
{
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
    private $arguments;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
    private $requiredCount;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
    private $hasAnArrayArgument = false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
    private $hasOptional;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    private $options;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
    private $shortcuts;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
     * Constructor.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
     * @param array $definition An array of InputArgument and InputOption instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
    public function __construct(array $definition = array())
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
        $this->setDefinition($definition);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
     * Sets the definition of the input.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
     * @param array $definition The definition array
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
    public function setDefinition(array $definition)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
        $arguments = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
        $options = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        foreach ($definition as $item) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
            if ($item instanceof InputOption) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
                $options[] = $item;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
            } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
                $arguments[] = $item;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
        $this->setArguments($arguments);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
        $this->setOptions($options);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
     * Sets the InputArgument objects.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
     * @param array $arguments An array of InputArgument objects
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
    public function setArguments($arguments = array())
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
        $this->arguments          = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
        $this->requiredCount      = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
        $this->hasOptional        = false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
        $this->hasAnArrayArgument = false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
        $this->addArguments($arguments);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
     * Add an array of InputArgument objects.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
     * @param InputArgument[] $arguments An array of InputArgument objects
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
    public function addArguments($arguments = array())
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
        if (null !== $arguments) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
            foreach ($arguments as $argument) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
                $this->addArgument($argument);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
     * Add an InputArgument object.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
     * @param InputArgument $argument An InputArgument object
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
     * @throws \LogicException When incorrect argument is given
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
    public function addArgument(InputArgument $argument)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
        if (isset($this->arguments[$argument->getName()])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
            throw new \LogicException(sprintf('An argument with name "%s" already exist.', $argument->getName()));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
        if ($this->hasAnArrayArgument) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
            throw new \LogicException('Cannot add an argument after an array argument.');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
        if ($argument->isRequired() && $this->hasOptional) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
            throw new \LogicException('Cannot add a required argument after an optional one.');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
        if ($argument->isArray()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
            $this->hasAnArrayArgument = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
        if ($argument->isRequired()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
            ++$this->requiredCount;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
            $this->hasOptional = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
        $this->arguments[$argument->getName()] = $argument;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
     * Returns an InputArgument by name or by position.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
     * @param string|integer $name The InputArgument name or position
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
     * @return InputArgument An InputArgument object
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
     * @throws \InvalidArgumentException When argument given doesn't exist
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
    public function getArgument($name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
        $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
        if (!$this->hasArgument($name)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
            throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
        return $arguments[$name];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
     * Returns true if an InputArgument object exists by name or position.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
     * @param string|integer $name The InputArgument name or position
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
     * @return Boolean true if the InputArgument object exists, false otherwise
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
    public function hasArgument($name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
        $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
        return isset($arguments[$name]);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
     * Gets the array of InputArgument objects.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
     * @return array An array of InputArgument objects
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
    public function getArguments()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
        return $this->arguments;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
     * Returns the number of InputArguments.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
     * @return integer The number of InputArguments
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
    public function getArgumentCount()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
        return $this->hasAnArrayArgument ? PHP_INT_MAX : count($this->arguments);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
     * Returns the number of required InputArguments.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
     * @return integer The number of required InputArguments
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
    public function getArgumentRequiredCount()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
        return $this->requiredCount;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
     * Gets the default values.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
     * @return array An array of default values
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
    public function getArgumentDefaults()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
        $values = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
        foreach ($this->arguments as $argument) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
            $values[$argument->getName()] = $argument->getDefault();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
        return $values;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
     * Sets the InputOption objects.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
     * @param array $options An array of InputOption objects
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
    public function setOptions($options = array())
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
        $this->options = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
        $this->shortcuts = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
        $this->addOptions($options);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
     * Add an array of InputOption objects.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
     * @param InputOption[] $options An array of InputOption objects
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
    public function addOptions($options = array())
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
        foreach ($options as $option) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
            $this->addOption($option);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
     * Add an InputOption object.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
     * @param InputOption $option An InputOption object
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
     * @throws \LogicException When option given already exist
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
    public function addOption(InputOption $option)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
        if (isset($this->options[$option->getName()])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
            throw new \LogicException(sprintf('An option named "%s" already exist.', $option->getName()));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
        } else if (isset($this->shortcuts[$option->getShortcut()])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
            throw new \LogicException(sprintf('An option with shortcut "%s" already exist.', $option->getShortcut()));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
        $this->options[$option->getName()] = $option;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
        if ($option->getShortcut()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
            $this->shortcuts[$option->getShortcut()] = $option->getName();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
     * Returns an InputOption by name.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
     * @param string $name The InputOption name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
     * @return InputOption A InputOption object
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
    public function getOption($name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
        if (!$this->hasOption($name)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
            throw new \InvalidArgumentException(sprintf('The "--%s" option does not exist.', $name));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
        return $this->options[$name];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
     * Returns true if an InputOption object exists by name.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
     * @param string $name The InputOption name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
     * @return Boolean true if the InputOption object exists, false otherwise
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
    public function hasOption($name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
        return isset($this->options[$name]);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
     * Gets the array of InputOption objects.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
     * @return array An array of InputOption objects
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
    public function getOptions()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
        return $this->options;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
     * Returns true if an InputOption object exists by shortcut.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
     * @param string $name The InputOption shortcut
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
     * @return Boolean true if the InputOption object exists, false otherwise
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
    public function hasShortcut($name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
        return isset($this->shortcuts[$name]);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
     * Gets an InputOption by shortcut.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
     * @param string $shortcut the Shortcut name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
     * @return InputOption An InputOption object
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
    public function getOptionForShortcut($shortcut)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
        return $this->getOption($this->shortcutToName($shortcut));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
     * Gets an array of default values.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
     * @return array An array of all default values
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
    public function getOptionDefaults()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
        $values = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
        foreach ($this->options as $option) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
            $values[$option->getName()] = $option->getDefault();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
        return $values;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
     * Returns the InputOption name given a shortcut.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
     * @param string $shortcut The shortcut
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
     * @return string The InputOption name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
     * @throws \InvalidArgumentException When option given does not exist
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
    private function shortcutToName($shortcut)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
        if (!isset($this->shortcuts[$shortcut])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
            throw new \InvalidArgumentException(sprintf('The "-%s" option does not exist.', $shortcut));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
        return $this->shortcuts[$shortcut];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
     * Gets the synopsis.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
     * @return string The synopsis
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
    public function getSynopsis()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
        $elements = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
        foreach ($this->getOptions() as $option) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
            $shortcut = $option->getShortcut() ? sprintf('-%s|', $option->getShortcut()) : '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
            $elements[] = sprintf('['.($option->isValueRequired() ? '%s--%s="..."' : ($option->isValueOptional() ? '%s--%s[="..."]' : '%s--%s')).']', $shortcut, $option->getName());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
        foreach ($this->getArguments() as $argument) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
            $elements[] = sprintf($argument->isRequired() ? '%s' : '[%s]', $argument->getName().($argument->isArray() ? '1' : ''));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
            if ($argument->isArray()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
                $elements[] = sprintf('... [%sN]', $argument->getName());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
        return implode(' ', $elements);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
     * Returns a textual representation of the InputDefinition.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
     * @return string A string representing the InputDefinition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
    public function asText()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
        // find the largest option or argument name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
        $max = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
        foreach ($this->getOptions() as $option) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
            $nameLength = strlen($option->getName()) + 2;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
            if ($option->getShortcut()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
                $nameLength += strlen($option->getShortcut()) + 3;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
            $max = max($max, $nameLength);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
        foreach ($this->getArguments() as $argument) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
            $max = max($max, strlen($argument->getName()));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
        ++$max;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
        $text = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
        if ($this->getArguments()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
            $text[] = '<comment>Arguments:</comment>';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
            foreach ($this->getArguments() as $argument) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
                if (null !== $argument->getDefault() && (!is_array($argument->getDefault()) || count($argument->getDefault()))) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
                    $default = sprintf('<comment> (default: %s)</comment>', is_array($argument->getDefault()) ? str_replace("\n", '', var_export($argument->getDefault(), true)): $argument->getDefault());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
                } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
                    $default = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
                $description = str_replace("\n", "\n".str_pad('', $max + 2, ' '), $argument->getDescription());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
                $text[] = sprintf(" <info>%-${max}s</info> %s%s", $argument->getName(), $description, $default);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
            $text[] = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
        if ($this->getOptions()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
            $text[] = '<comment>Options:</comment>';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
            foreach ($this->getOptions() as $option) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
                if ($option->acceptValue() && null !== $option->getDefault() && (!is_array($option->getDefault()) || count($option->getDefault()))) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
                    $default = sprintf('<comment> (default: %s)</comment>', is_array($option->getDefault()) ? str_replace("\n", '', print_r($option->getDefault(), true)): $option->getDefault());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
                } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
                    $default = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
                $multiple = $option->isArray() ? '<comment> (multiple values allowed)</comment>' : '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
                $description = str_replace("\n", "\n".str_pad('', $max + 2, ' '), $option->getDescription());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
                $optionMax = $max - strlen($option->getName()) - 2;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
                $text[] = sprintf(" <info>%s</info> %-${optionMax}s%s%s%s",
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
                    '--'.$option->getName(),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
                    $option->getShortcut() ? sprintf('(-%s) ', $option->getShortcut()) : '',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
                    $description,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
                    $default,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
                    $multiple
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
                );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
            $text[] = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
        return implode("\n", $text);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
     * Returns an XML representation of the InputDefinition.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
     * @param Boolean $asDom Whether to return a DOM or an XML string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
     * @return string|DOMDocument An XML string representing the InputDefinition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
    public function asXml($asDom = false)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
        $dom = new \DOMDocument('1.0', 'UTF-8');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
        $dom->formatOutput = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
        $dom->appendChild($definitionXML = $dom->createElement('definition'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
        $definitionXML->appendChild($argumentsXML = $dom->createElement('arguments'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
        foreach ($this->getArguments() as $argument) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
            $argumentsXML->appendChild($argumentXML = $dom->createElement('argument'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
            $argumentXML->setAttribute('name', $argument->getName());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
            $argumentXML->setAttribute('is_required', $argument->isRequired() ? 1 : 0);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
            $argumentXML->setAttribute('is_array', $argument->isArray() ? 1 : 0);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
            $argumentXML->appendChild($descriptionXML = $dom->createElement('description'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
            $descriptionXML->appendChild($dom->createTextNode($argument->getDescription()));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
            $argumentXML->appendChild($defaultsXML = $dom->createElement('defaults'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
            $defaults = is_array($argument->getDefault()) ? $argument->getDefault() : ($argument->getDefault() ? array($argument->getDefault()) : array());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
            foreach ($defaults as $default) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
                $defaultsXML->appendChild($defaultXML = $dom->createElement('default'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
                $defaultXML->appendChild($dom->createTextNode($default));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
        $definitionXML->appendChild($optionsXML = $dom->createElement('options'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
        foreach ($this->getOptions() as $option) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
            $optionsXML->appendChild($optionXML = $dom->createElement('option'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
            $optionXML->setAttribute('name', '--'.$option->getName());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
            $optionXML->setAttribute('shortcut', $option->getShortcut() ? '-'.$option->getShortcut() : '');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
            $optionXML->setAttribute('accept_value', $option->acceptValue() ? 1 : 0);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
            $optionXML->setAttribute('is_value_required', $option->isValueRequired() ? 1 : 0);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
            $optionXML->setAttribute('is_multiple', $option->isArray() ? 1 : 0);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
            $optionXML->appendChild($descriptionXML = $dom->createElement('description'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
            $descriptionXML->appendChild($dom->createTextNode($option->getDescription()));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
            if ($option->acceptValue()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
                $optionXML->appendChild($defaultsXML = $dom->createElement('defaults'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
                $defaults = is_array($option->getDefault()) ? $option->getDefault() : ($option->getDefault() ? array($option->getDefault()) : array());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
                foreach ($defaults as $default) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
                    $defaultsXML->appendChild($defaultXML = $dom->createElement('default'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
                    $defaultXML->appendChild($dom->createTextNode($default));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
        return $asDom ? $dom : $dom->saveXml();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
}