2015-08-18 00:00:26 +00: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\Helper ;
2016-04-20 16:56:34 +00:00
use Symfony\Component\Console\Exception\LogicException ;
2018-11-23 12:29:20 +00:00
use Symfony\Component\Console\Formatter\OutputFormatter ;
2015-08-18 00:00:26 +00:00
use Symfony\Component\Console\Input\InputInterface ;
use Symfony\Component\Console\Output\OutputInterface ;
use Symfony\Component\Console\Question\ChoiceQuestion ;
use Symfony\Component\Console\Question\ConfirmationQuestion ;
use Symfony\Component\Console\Question\Question ;
use Symfony\Component\Console\Style\SymfonyStyle ;
/**
* Symfony Style Guide compliant question helper .
*
* @ author Kevin Bond < kevinbond @ gmail . com >
*/
class SymfonyQuestionHelper extends QuestionHelper
{
/**
* { @ inheritdoc }
2018-11-23 12:29:20 +00:00
*
* To be removed in 4.0
2015-08-18 00:00:26 +00:00
*/
public function ask ( InputInterface $input , OutputInterface $output , Question $question )
{
$validator = $question -> getValidator ();
$question -> setValidator ( function ( $value ) use ( $validator ) {
2016-04-20 16:56:34 +00:00
if ( null !== $validator ) {
2015-08-18 00:00:26 +00:00
$value = $validator ( $value );
2017-02-03 00:28:38 +00:00
} else {
// make required
2018-11-23 12:29:20 +00:00
if ( ! \is_array ( $value ) && ! \is_bool ( $value ) && 0 === \strlen ( $value )) {
@ trigger_error ( 'The default question validator is deprecated since Symfony 3.3 and will not be used anymore in version 4.0. Set a custom question validator if needed.' , E_USER_DEPRECATED );
2017-02-03 00:28:38 +00:00
throw new LogicException ( 'A value is required.' );
}
2015-08-18 00:00:26 +00:00
}
return $value ;
});
return parent :: ask ( $input , $output , $question );
}
/**
* { @ inheritdoc }
*/
protected function writePrompt ( OutputInterface $output , Question $question )
{
2017-02-03 00:28:38 +00:00
$text = OutputFormatter :: escapeTrailingBackslash ( $question -> getQuestion ());
2015-08-18 00:00:26 +00:00
$default = $question -> getDefault ();
switch ( true ) {
case null === $default :
$text = sprintf ( ' <info>%s</info>:' , $text );
break ;
case $question instanceof ConfirmationQuestion :
$text = sprintf ( ' <info>%s (yes/no)</info> [<comment>%s</comment>]:' , $text , $default ? 'yes' : 'no' );
break ;
2017-02-03 00:28:38 +00:00
case $question instanceof ChoiceQuestion && $question -> isMultiselect () :
$choices = $question -> getChoices ();
$default = explode ( ',' , $default );
foreach ( $default as $key => $value ) {
$default [ $key ] = $choices [ trim ( $value )];
}
$text = sprintf ( ' <info>%s</info> [<comment>%s</comment>]:' , $text , OutputFormatter :: escape ( implode ( ', ' , $default )));
break ;
2015-08-18 00:00:26 +00:00
case $question instanceof ChoiceQuestion :
$choices = $question -> getChoices ();
2018-11-23 12:29:20 +00:00
$text = sprintf ( ' <info>%s</info> [<comment>%s</comment>]:' , $text , OutputFormatter :: escape ( isset ( $choices [ $default ]) ? $choices [ $default ] : $default ));
2015-08-18 00:00:26 +00:00
break ;
default :
2017-02-03 00:28:38 +00:00
$text = sprintf ( ' <info>%s</info> [<comment>%s</comment>]:' , $text , OutputFormatter :: escape ( $default ));
2015-08-18 00:00:26 +00:00
}
$output -> writeln ( $text );
if ( $question instanceof ChoiceQuestion ) {
$width = max ( array_map ( 'strlen' , array_keys ( $question -> getChoices ())));
foreach ( $question -> getChoices () as $key => $value ) {
$output -> writeln ( sprintf ( " [<comment>%- ${ width } s</comment>] %s " , $key , $value ));
}
}
$output -> write ( ' > ' );
}
/**
* { @ inheritdoc }
*/
protected function writeError ( OutputInterface $output , \Exception $error )
{
if ( $output instanceof SymfonyStyle ) {
$output -> newLine ();
$output -> error ( $error -> getMessage ());
return ;
}
parent :: writeError ( $output , $error );
}
}