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: /**
15: * Represents a command line option.
16: *
17: * @author Fabien Potencier <fabien@symfony.com>
18: *
19: * @api
20: */
21: class InputOption
22: {
23: const VALUE_NONE = 1;
24: const VALUE_REQUIRED = 2;
25: const VALUE_OPTIONAL = 4;
26: const VALUE_IS_ARRAY = 8;
27:
28: private $name;
29: private $shortcut;
30: private $mode;
31: private $default;
32: private $description;
33:
34: /**
35: * Constructor.
36: *
37: * @param string $name The option name
38: * @param string $shortcut The shortcut (can be null)
39: * @param integer $mode The option mode: One of the VALUE_* constants
40: * @param string $description A description text
41: * @param mixed $default The default value (must be null for self::VALUE_REQUIRED or self::VALUE_NONE)
42: *
43: * @throws \InvalidArgumentException If option mode is invalid or incompatible
44: *
45: * @api
46: */
47: public function __construct($name, $shortcut = null, $mode = null, $description = '', $default = null)
48: {
49: if (0 === strpos($name, '--')) {
50: $name = substr($name, 2);
51: }
52:
53: if (empty($name)) {
54: throw new \InvalidArgumentException('An option name cannot be empty.');
55: }
56:
57: if (empty($shortcut)) {
58: $shortcut = null;
59: }
60:
61: if (null !== $shortcut) {
62: if ('-' === $shortcut[0]) {
63: $shortcut = substr($shortcut, 1);
64: }
65:
66: if (empty($shortcut)) {
67: throw new \InvalidArgumentException('An option shortcut cannot be empty.');
68: }
69: }
70:
71: if (null === $mode) {
72: $mode = self::VALUE_NONE;
73: } elseif (!is_int($mode) || $mode > 15 || $mode < 1) {
74: throw new \InvalidArgumentException(sprintf('Option mode "%s" is not valid.', $mode));
75: }
76:
77: $this->name = $name;
78: $this->shortcut = $shortcut;
79: $this->mode = $mode;
80: $this->description = $description;
81:
82: if ($this->isArray() && !$this->acceptValue()) {
83: throw new \InvalidArgumentException('Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.');
84: }
85:
86: $this->setDefault($default);
87: }
88:
89: /**
90: * Returns the option shortcut.
91: *
92: * @return string The shortcut
93: */
94: public function getShortcut()
95: {
96: return $this->shortcut;
97: }
98:
99: /**
100: * Returns the option name.
101: *
102: * @return string The name
103: */
104: public function getName()
105: {
106: return $this->name;
107: }
108:
109: /**
110: * Returns true if the option accepts a value.
111: *
112: * @return Boolean true if value mode is not self::VALUE_NONE, false otherwise
113: */
114: public function acceptValue()
115: {
116: return $this->isValueRequired() || $this->isValueOptional();
117: }
118:
119: /**
120: * Returns true if the option requires a value.
121: *
122: * @return Boolean true if value mode is self::VALUE_REQUIRED, false otherwise
123: */
124: public function isValueRequired()
125: {
126: return self::VALUE_REQUIRED === (self::VALUE_REQUIRED & $this->mode);
127: }
128:
129: /**
130: * Returns true if the option takes an optional value.
131: *
132: * @return Boolean true if value mode is self::VALUE_OPTIONAL, false otherwise
133: */
134: public function isValueOptional()
135: {
136: return self::VALUE_OPTIONAL === (self::VALUE_OPTIONAL & $this->mode);
137: }
138:
139: /**
140: * Returns true if the option can take multiple values.
141: *
142: * @return Boolean true if mode is self::VALUE_IS_ARRAY, false otherwise
143: */
144: public function isArray()
145: {
146: return self::VALUE_IS_ARRAY === (self::VALUE_IS_ARRAY & $this->mode);
147: }
148:
149: /**
150: * Sets the default value.
151: *
152: * @param mixed $default The default value
153: *
154: * @throws \LogicException When incorrect default value is given
155: */
156: public function setDefault($default = null)
157: {
158: if (self::VALUE_NONE === (self::VALUE_NONE & $this->mode) && null !== $default) {
159: throw new \LogicException('Cannot set a default value when using InputOption::VALUE_NONE mode.');
160: }
161:
162: if ($this->isArray()) {
163: if (null === $default) {
164: $default = array();
165: } elseif (!is_array($default)) {
166: throw new \LogicException('A default value for an array option must be an array.');
167: }
168: }
169:
170: $this->default = $this->acceptValue() ? $default : false;
171: }
172:
173: /**
174: * Returns the default value.
175: *
176: * @return mixed The default value
177: */
178: public function getDefault()
179: {
180: return $this->default;
181: }
182:
183: /**
184: * Returns the description text.
185: *
186: * @return string The description text
187: */
188: public function getDescription()
189: {
190: return $this->description;
191: }
192:
193: /**
194: * Checks whether the given option equals this one
195: *
196: * @param InputOption $option option to compare
197: * @return Boolean
198: */
199: public function equals(InputOption $option)
200: {
201: return $option->getName() === $this->getName()
202: && $option->getShortcut() === $this->getShortcut()
203: && $option->getDefault() === $this->getDefault()
204: && $option->isArray() === $this->isArray()
205: && $option->isValueRequired() === $this->isValueRequired()
206: && $option->isValueOptional() === $this->isValueOptional()
207: ;
208: }
209: }
210: