From cee82fc7406fc5ffd1fd6922ccef1e694388a7ef Mon Sep 17 00:00:00 2001 From: Christopher Vagnetoft Date: Wed, 25 Jan 2017 21:49:26 +0100 Subject: [PATCH] Added getInput() method for basic async input --- examples/input.php | 31 +++++++++++++++++++++++++++++++ lib/Shell.php | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 examples/input.php diff --git a/examples/input.php b/examples/input.php new file mode 100644 index 0000000..8af906b --- /dev/null +++ b/examples/input.php @@ -0,0 +1,31 @@ +setPrompt("test>"); + +// Create an anonymous context and add a command +$ctx = $myShell->createContext("root"); +$ctx->addCommand("hello", function () use ($myShell) { + $myShell->getInput("What is your name?", function ($name) use ($myShell) { + echo "Hello, {$name}\n"; + $myShell->getInput("Who is your daddy and what does he do?", function ($daddy) { + echo "{$daddy}? Oookay...\n"; + }); + }); +}); + +// Run the shell +$myShell->run(); diff --git a/lib/Shell.php b/lib/Shell.php index db3e0e8..fdedc3b 100644 --- a/lib/Shell.php +++ b/lib/Shell.php @@ -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. *