2015-08-17 17:00:26 -07:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\Console\Input ;
2016-04-20 09:56:34 -07:00
use Symfony\Component\Console\Exception\InvalidArgumentException ;
use Symfony\Component\Console\Exception\LogicException ;
2015-08-17 17:00:26 -07:00
/**
* Represents a command line option .
*
* @ author Fabien Potencier < fabien @ symfony . com >
*/
class InputOption
{
const VALUE_NONE = 1 ;
const VALUE_REQUIRED = 2 ;
const VALUE_OPTIONAL = 4 ;
const VALUE_IS_ARRAY = 8 ;
private $name ;
private $shortcut ;
private $mode ;
private $default ;
private $description ;
/**
* Constructor .
*
* @ param string $name The option name
* @ param string | array $shortcut The shortcuts , can be null , a string of shortcuts delimited by | or an array of shortcuts
* @ param int $mode The option mode : One of the VALUE_ * constants
* @ param string $description A description text
2016-04-20 09:56:34 -07:00
* @ param mixed $default The default value ( must be null for self :: VALUE_NONE )
2015-08-17 17:00:26 -07:00
*
2016-04-20 09:56:34 -07:00
* @ throws InvalidArgumentException If option mode is invalid or incompatible
2015-08-17 17:00:26 -07:00
*/
public function __construct ( $name , $shortcut = null , $mode = null , $description = '' , $default = null )
{
if ( 0 === strpos ( $name , '--' )) {
$name = substr ( $name , 2 );
}
if ( empty ( $name )) {
2016-04-20 09:56:34 -07:00
throw new InvalidArgumentException ( 'An option name cannot be empty.' );
2015-08-17 17:00:26 -07:00
}
if ( empty ( $shortcut )) {
$shortcut = null ;
}
if ( null !== $shortcut ) {
if ( is_array ( $shortcut )) {
$shortcut = implode ( '|' , $shortcut );
}
$shortcuts = preg_split ( '{(\|)-?}' , ltrim ( $shortcut , '-' ));
$shortcuts = array_filter ( $shortcuts );
$shortcut = implode ( '|' , $shortcuts );
if ( empty ( $shortcut )) {
2016-04-20 09:56:34 -07:00
throw new InvalidArgumentException ( 'An option shortcut cannot be empty.' );
2015-08-17 17:00:26 -07:00
}
}
if ( null === $mode ) {
$mode = self :: VALUE_NONE ;
} elseif ( ! is_int ( $mode ) || $mode > 15 || $mode < 1 ) {
2016-04-20 09:56:34 -07:00
throw new InvalidArgumentException ( sprintf ( 'Option mode "%s" is not valid.' , $mode ));
2015-08-17 17:00:26 -07:00
}
$this -> name = $name ;
$this -> shortcut = $shortcut ;
$this -> mode = $mode ;
$this -> description = $description ;
if ( $this -> isArray () && ! $this -> acceptValue ()) {
2016-04-20 09:56:34 -07:00
throw new InvalidArgumentException ( 'Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.' );
2015-08-17 17:00:26 -07:00
}
$this -> setDefault ( $default );
}
/**
* Returns the option shortcut .
*
* @ return string The shortcut
*/
public function getShortcut ()
{
return $this -> shortcut ;
}
/**
* Returns the option name .
*
* @ return string The name
*/
public function getName ()
{
return $this -> name ;
}
/**
* Returns true if the option accepts a value .
*
* @ return bool true if value mode is not self :: VALUE_NONE , false otherwise
*/
public function acceptValue ()
{
return $this -> isValueRequired () || $this -> isValueOptional ();
}
/**
* Returns true if the option requires a value .
*
* @ return bool true if value mode is self :: VALUE_REQUIRED , false otherwise
*/
public function isValueRequired ()
{
return self :: VALUE_REQUIRED === ( self :: VALUE_REQUIRED & $this -> mode );
}
/**
* Returns true if the option takes an optional value .
*
* @ return bool true if value mode is self :: VALUE_OPTIONAL , false otherwise
*/
public function isValueOptional ()
{
return self :: VALUE_OPTIONAL === ( self :: VALUE_OPTIONAL & $this -> mode );
}
/**
* Returns true if the option can take multiple values .
*
* @ return bool true if mode is self :: VALUE_IS_ARRAY , false otherwise
*/
public function isArray ()
{
return self :: VALUE_IS_ARRAY === ( self :: VALUE_IS_ARRAY & $this -> mode );
}
/**
* Sets the default value .
*
* @ param mixed $default The default value
*
2016-04-20 09:56:34 -07:00
* @ throws LogicException When incorrect default value is given
2015-08-17 17:00:26 -07:00
*/
public function setDefault ( $default = null )
{
if ( self :: VALUE_NONE === ( self :: VALUE_NONE & $this -> mode ) && null !== $default ) {
2016-04-20 09:56:34 -07:00
throw new LogicException ( 'Cannot set a default value when using InputOption::VALUE_NONE mode.' );
2015-08-17 17:00:26 -07:00
}
if ( $this -> isArray ()) {
if ( null === $default ) {
$default = array ();
} elseif ( ! is_array ( $default )) {
2016-04-20 09:56:34 -07:00
throw new LogicException ( 'A default value for an array option must be an array.' );
2015-08-17 17:00:26 -07:00
}
}
$this -> default = $this -> acceptValue () ? $default : false ;
}
/**
* Returns the default value .
*
* @ return mixed The default value
*/
public function getDefault ()
{
return $this -> default ;
}
/**
* Returns the description text .
*
* @ return string The description text
*/
public function getDescription ()
{
return $this -> description ;
}
/**
* Checks whether the given option equals this one .
*
* @ param InputOption $option option to compare
*
* @ return bool
*/
public function equals ( InputOption $option )
{
return $option -> getName () === $this -> getName ()
&& $option -> getShortcut () === $this -> getShortcut ()
&& $option -> getDefault () === $this -> getDefault ()
&& $option -> isArray () === $this -> isArray ()
&& $option -> isValueRequired () === $this -> isValueRequired ()
&& $option -> isValueOptional () === $this -> isValueOptional ()
;
}
}