Added getInput() method for basic async input
This commit is contained in:
@ -54,6 +54,18 @@ class Shell
|
||||
* @var Style The style applied to the input text
|
||||
*/
|
||||
protected $input_style = null;
|
||||
/**
|
||||
* @var callable The callback to pass the input on to
|
||||
*/
|
||||
protected $input_callback = null;
|
||||
/**
|
||||
* @var string Question prompt for getInput()
|
||||
*/
|
||||
protected $input_prompt = null;
|
||||
/**
|
||||
* @var string The prompt before changing to $input_prompt
|
||||
*/
|
||||
protected $input_last_prompt = null;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
@ -227,7 +239,7 @@ class Shell
|
||||
public function setPrompt($text)
|
||||
{
|
||||
$this->prompt = $text;
|
||||
|
||||
|
||||
if ($this->lineReader) {
|
||||
$this->lineReader->setPromptText($text);
|
||||
}
|
||||
@ -532,6 +544,31 @@ class Shell
|
||||
return $event;
|
||||
}
|
||||
|
||||
public function getInput($prompt, callable $callback)
|
||||
{
|
||||
$this->addListener(Shell::EVT_UPDATE_PROMPT, [ $this, "onInputPrompt" ], $prompt);
|
||||
$this->addListener(Shell::EVT_BEFORE_COMMAND, [ $this, "onInputHandler" ], $this->prompt, $callback);
|
||||
}
|
||||
|
||||
public function onInputPrompt(Event $e, $prompt)
|
||||
{
|
||||
$this->setPrompt($prompt);
|
||||
$e->stopPropagation();
|
||||
$this->removeListener(Shell::EVT_UPDATE_PROMPT, [ $this, "onInputPrompt" ], $prompt);
|
||||
}
|
||||
|
||||
public function onInputHandler(Event $e, $last_prompt, $callback)
|
||||
{
|
||||
// Restore the prompt
|
||||
$this->setPrompt($last_prompt);
|
||||
// Remove the listeners and compose the result string
|
||||
$this->removeListener(Shell::EVT_BEFORE_COMMAND, [ $this, "onInputHandler" ], $last_prompt, $callback);
|
||||
$input = trim($e->command." ".join(" ",$e->args));
|
||||
$e->stopPropagation();
|
||||
// Call the callback
|
||||
call_user_func($callback, $input);
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop the shell; calling this method will cause the main run() to return.
|
||||
*
|
||||
|
Reference in New Issue
Block a user