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($shortcut)) {
54: $shortcut = null;
55: }
56:
57: if (null !== $shortcut) {
58: if ('-' === $shortcut[0]) {
59: $shortcut = substr($shortcut, 1);
60: }
61: }
62:
63: if (null === $mode) {
64: $mode = self::VALUE_NONE;
65: } elseif (!is_int($mode) || $mode > 15 || $mode < 1) {
66: throw new \InvalidArgumentException(sprintf('Option mode "%s" is not valid.', $mode));
67: }
68:
69: $this->name = $name;
70: $this->shortcut = $shortcut;
71: $this->mode = $mode;
72: $this->description = $description;
73:
74: if ($this->isArray() && !$this->acceptValue()) {
75: throw new \InvalidArgumentException('Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.');
76: }
77:
78: $this->setDefault($default);
79: }
80:
81: /**
82: * Returns the option shortcut.
83: *
84: * @return string The shortcut
85: */
86: public function getShortcut()
87: {
88: return $this->shortcut;
89: }
90:
91: /**
92: * Returns the option name.
93: *
94: * @return string The name
95: */
96: public function getName()
97: {
98: return $this->name;
99: }
100:
101: /**
102: * Returns true if the option accepts a value.
103: *
104: * @return Boolean true if value mode is not self::VALUE_NONE, false otherwise
105: */
106: public function acceptValue()
107: {
108: return $this->isValueRequired() || $this->isValueOptional();
109: }
110:
111: /**
112: * Returns true if the option requires a value.
113: *
114: * @return Boolean true if value mode is self::VALUE_REQUIRED, false otherwise
115: */
116: public function isValueRequired()
117: {
118: return self::VALUE_REQUIRED === (self::VALUE_REQUIRED & $this->mode);
119: }
120:
121: /**
122: * Returns true if the option takes an optional value.
123: *
124: * @return Boolean true if value mode is self::VALUE_OPTIONAL, false otherwise
125: */
126: public function isValueOptional()
127: {
128: return self::VALUE_OPTIONAL === (self::VALUE_OPTIONAL & $this->mode);
129: }
130:
131: /**
132: * Returns true if the option can take multiple values.
133: *
134: * @return Boolean true if mode is self::VALUE_IS_ARRAY, false otherwise
135: */
136: public function isArray()
137: {
138: return self::VALUE_IS_ARRAY === (self::VALUE_IS_ARRAY & $this->mode);
139: }
140:
141: /**
142: * Sets the default value.
143: *
144: * @param mixed $default The default value
145: *
146: * @throws \LogicException When incorrect default value is given
147: */
148: public function setDefault($default = null)
149: {
150: if (self::VALUE_NONE === (self::VALUE_NONE & $this->mode) && null !== $default) {
151: throw new \LogicException('Cannot set a default value when using Option::VALUE_NONE mode.');
152: }
153:
154: if ($this->isArray()) {
155: if (null === $default) {
156: $default = array();
157: } elseif (!is_array($default)) {
158: throw new \LogicException('A default value for an array option must be an array.');
159: }
160: }
161:
162: $this->default = $this->acceptValue() ? $default : false;
163: }
164:
165: /**
166: * Returns the default value.
167: *
168: * @return mixed The default value
169: */
170: public function getDefault()
171: {
172: return $this->default;
173: }
174:
175: /**
176: * Returns the description text.
177: *
178: * @return string The description text
179: */
180: public function getDescription()
181: {
182: return $this->description;
183: }
184:
185: /**
186: * Checks whether the given option equals this one
187: *
188: * @param InputOption $option option to compare
189: * @return Boolean
190: */
191: public function equals(InputOption $option)
192: {
193: return $option->getName() === $this->getName()
194: && $option->getShortcut() === $this->getShortcut()
195: && $option->getDefault() === $this->getDefault()
196: && $option->isArray() === $this->isArray()
197: && $option->isValueRequired() === $this->isValueRequired()
198: && $option->isValueOptional() === $this->isValueOptional()
199: ;
200: }
201: }
202: