1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427:
<?php
/*
* This file is part of the webmozart/console package.
*
* (c) Bernhard Schussek <bschussek@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Webmozart\Console\Api\Config;
use InvalidArgumentException;
use Symfony\Component\Console\Helper\HelperSet;
use Webmozart\Assert\Assert;
use Webmozart\Console\Api\Args\ArgsParser;
use Webmozart\Console\Api\Args\Format\ArgsFormatBuilder;
use Webmozart\Console\Api\Args\Format\Argument;
use Webmozart\Console\Api\Args\Format\Option;
use Webmozart\Console\Args\DefaultArgsParser;
use Webmozart\Console\Handler\NullHandler;
/**
* Implements methods shared by all configurations.
*
* @since 1.0
*
* @author Bernhard Schussek <bschussek@gmail.com>
*/
abstract class Config
{
/**
* @var ArgsFormatBuilder
*/
private $formatBuilder;
/**
* @var HelperSet
*/
private $helperSet;
/**
* @var ArgsParser
*/
private $argsParser;
/**
* @var bool
*/
private $lenientArgsParsing;
/**
* @var object|callable
*/
private $handler;
/**
* @var string
*/
private $handlerMethod;
/**
* Creates a new configuration.
*/
public function __construct()
{
$this->formatBuilder = new ArgsFormatBuilder();
$this->configure();
}
/**
* Returns the configured arguments.
*
* Read {@link Argument} for a more detailed description of arguments.
*
* @return Argument[] The configured arguments.
*
* @see addArgument()
*/
public function getArguments()
{
return $this->formatBuilder->getArguments();
}
/**
* Adds an argument.
*
* Read {@link Argument} for a more detailed description of console
* arguments.
*
* @param string $name The argument name.
* @param int $flags A bitwise combination of the flag constants in
* the {@link Argument} class.
* @param string $description A one-line description of the argument.
* @param mixed $default The default value. Must be `null` if the
* flags contain {@link Argument::REQUIRED}.
*
* @return ApplicationConfig|CommandConfig|SubCommandConfig|OptionCommandConfig The current instance.
*
* @see getArguments()
*/
public function addArgument($name, $flags = 0, $description = null, $default = null)
{
$this->formatBuilder->addArgument(new Argument($name, $flags, $description, $default));
return $this;
}
/**
* Returns the configured options.
*
* Read {@link Option} for a more detailed description of console options.
*
* @return Option[] The configured options.
*
* @see addOption()
*/
public function getOptions()
{
return $this->formatBuilder->getOptions();
}
/**
* Adds an option.
*
* Read {@link Option} for a more detailed description of console options.
*
* @param string $longName The long option name.
* @param string $shortName The short option name. Can be `null`.
* @param int $flags A bitwise combination of the flag constants in
* the {@link Option} class.
* @param string $description A one-line description of the option.
* @param mixed $default The default value. Must be `null` if the
* flags contain {@link Option::REQUIRED_VALUE}.
* @param string $valueName The name of the value to be used in usage
* examples of the option.
*
* @return ApplicationConfig|CommandConfig|SubCommandConfig|OptionCommandConfig The current instance.
*
* @see getOptions()
*/
public function addOption($longName, $shortName = null, $flags = 0, $description = null, $default = null, $valueName = '...')
{
$this->formatBuilder->addOption(new Option($longName, $shortName, $flags, $description, $default, $valueName));
return $this;
}
/**
* Returns the configured helper set.
*
* @return HelperSet The helper set.
*
* @see setHelperSet()
*/
public function getHelperSet()
{
if (!$this->helperSet) {
return $this->getDefaultHelperSet();
}
return $this->helperSet;
}
/**
* Sets the used helper set.
*
* @param HelperSet $helperSet The helper set.
*
* @return ApplicationConfig|CommandConfig|SubCommandConfig|OptionCommandConfig The current instance.
*
* @see getHelperSet()
*/
public function setHelperSet(HelperSet $helperSet)
{
$this->helperSet = $helperSet;
return $this;
}
/**
* Returns the configured argument parser.
*
* @return ArgsParser The argument parser.
*
* @see setArgsParser()
*/
public function getArgsParser()
{
if (!$this->argsParser) {
return $this->getDefaultArgsParser();
}
return $this->argsParser;
}
/**
* Sets the used argument parser.
*
* @param ArgsParser $argsParser The argument parser.
*
* @return ApplicationConfig|CommandConfig|SubCommandConfig|OptionCommandConfig The current instance.
*
* @see getArgsParser()
*/
public function setArgsParser(ArgsParser $argsParser)
{
$this->argsParser = $argsParser;
return $this;
}
/**
* Returns whether lenient argument parsing is enabled.
*
* When lenient argument parsing is enabled, the argument parser will not
* fail if the console arguments contain invalid or missing arguments.
*
* @return bool Returns `true` if lenient parsing is enabled and `false`
* otherwise.
*/
public function isLenientArgsParsingEnabled()
{
if (null === $this->lenientArgsParsing) {
return $this->getDefaultLenientArgsParsing();
}
return $this->lenientArgsParsing;
}
/**
* Enables lenient argument parsing.
*
* When lenient argument parsing is enabled, the argument parser will not
* fail if the console arguments contain invalid or missing arguments.
*
* Lenient argument parsing is disabled by default.
*
* @return ApplicationConfig|CommandConfig|SubCommandConfig|OptionCommandConfig The current instance.
*
* @see disableLenientArgsParsing()
*/
public function enableLenientArgsParsing()
{
$this->lenientArgsParsing = true;
return $this;
}
/**
* Disables lenient argument parsing.
*
* When lenient argument parsing is enabled, the argument parser will not
* fail if the console arguments contain invalid or missing arguments.
*
* Lenient argument parsing is disabled by default.
*
* @return ApplicationConfig|CommandConfig|SubCommandConfig|OptionCommandConfig The current instance.
*
* @see enableLenientArgsParsing()
*/
public function disableLenientArgsParsing()
{
$this->lenientArgsParsing = false;
return $this;
}
/**
* Returns the command handler to execute when a command is run.
*
* @return object The command handler.
*
* @see setHandler()
*/
public function getHandler()
{
if (!$this->handler) {
return $this->getDefaultHandler();
}
if (is_callable($this->handler)) {
$this->handler = call_user_func($this->handler);
}
return $this->handler;
}
/**
* Sets the command handler to execute when a command is run.
*
* You can pass:
*
* * An object with handler methods.
* * A callable that receives a {@link Command} and returns an object with
* handler methods.
*
* The name of the executed handler method can be configured with
* {@link setHandlerMethod()}. By default, the method `handle()` is
* executed.
*
* @param object|callback $handler The command handler or the callable
* creating a new command handler on demand.
*
* @return ApplicationConfig|CommandConfig|SubCommandConfig|OptionCommandConfig The current instance.
*
* @see getHandler()
*/
public function setHandler($handler)
{
if (!is_object($handler) && !is_callable($handler)) {
throw new InvalidArgumentException(sprintf(
'Expected an object or a callable. Got: %s',
is_object($handler) ? get_class($handler) : gettype($handler)
));
}
$this->handler = $handler;
return $this;
}
/**
* Returns the method of the command handler that should be executed when
* the configured command is run.
*
* @return string The method name.
*
* @see setHandlerMethod()
*/
public function getHandlerMethod()
{
if (!$this->handlerMethod) {
return $this->getDefaultHandlerMethod();
}
return $this->handlerMethod;
}
/**
* Sets the method of the command handler that should be executed when the
* configured command is run.
*
* The method receives three arguments:
*
* * {@link Args} `$args`: The console arguments.
* * {@link IO} `$io`: The I/O.
* * {@link Command} `$command`: The executed command.
*
* @param string $handlerMethod The method name.
*
* @return ApplicationConfig|CommandConfig|SubCommandConfig|OptionCommandConfig The current instance.
*
* @see getHandlerMethod()
*/
public function setHandlerMethod($handlerMethod)
{
Assert::string($handlerMethod, 'The handler method must be a string. Got: %s');
Assert::notEmpty($handlerMethod, 'The handler method must not be empty.');
$this->handlerMethod = $handlerMethod;
return $this;
}
/**
* Returns the helper set to use if none is set.
*
* @return HelperSet The default helper set.
*/
protected function getDefaultHelperSet()
{
return new HelperSet();
}
/**
* Returns the command handler to use if none is set.
*
* @return object The default command handler.
*/
protected function getDefaultHandler()
{
return new NullHandler();
}
/**
* Returns the handler method to use if none is set.
*
* @return string The default handler method.
*/
protected function getDefaultHandlerMethod()
{
return 'handle';
}
/**
* Returns the arguments parser to use if none is set.
*
* @return ArgsParser The default args parser.
*/
protected function getDefaultArgsParser()
{
return new DefaultArgsParser();
}
/**
* Returns whether the arguments parsing handles errors gracefully.
*
* @return bool The default value for lenient args parsing.
*/
protected function getDefaultLenientArgsParsing()
{
return false;
}
/**
* Adds the default configuration.
*
* Override this method in your own subclasses.
*/
protected function configure()
{
}
}