diff options
author | Fbenas <philbeansburton@gmail.com> | 2020-06-07 02:59:59 +0100 |
---|---|---|
committer | Fbenas <philbeansburton@gmail.com> | 2020-06-07 02:59:59 +0100 |
commit | b82f2c74d1fdb0e0aaaa4c93a2a904e376b310a2 (patch) | |
tree | bc1f3000424f9a837606bf610f80af0356ff7c5f | |
parent | 1a9f3aa5596c2a9fa9096e56d29fea1e14bdaad7 (diff) |
First pass at a php IRC helperfor I/O handling
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | composer.json | 22 | ||||
-rw-r--r-- | src/Application.php | 95 | ||||
-rw-r--r-- | src/Command.php | 21 |
4 files changed, 140 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d1502b0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +vendor/ +composer.lock diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..0c689db --- /dev/null +++ b/composer.json @@ -0,0 +1,22 @@ +{ + "name": "fbeans/blairc", + "type": "library", + "description": "Symfony Filesystem Component", + "keywords": [], + "version": "0.1", + "authors": [ + { + "name": "Fbenas", + "email": "phil@pgburton.com" + } + ], + "require": { + "symfony/console": "^5.2" + }, + "autoload": { + "psr-4": { + "FBeans\\BlaIRC\\": "src/" + } + }, + "minimum-stability": "dev" +} diff --git a/src/Application.php b/src/Application.php new file mode 100644 index 0000000..88843ac --- /dev/null +++ b/src/Application.php @@ -0,0 +1,95 @@ +<?php + +namespace FBeans\BlaIRC; + +use FBeans\BlaIRC\Command; +use Symfony\Component\Console\Application as SymfonyApplication; +use Symfony\Component\Console\Input\ArrayInput; +use Symfony\Component\Console\Input\ArgvInput; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\ConsoleOutput; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Process\Process; + +abstract class Application +{ + protected $input; + protected $output; + protected $application; + + // ... put here the code to run in your command + + // this method must return an integer number with the "exit status code" + // of the command. You can also use these constants to make code more readable + + // return this if there was no problem running the command + // (it's equivalent to returning int(0)) + + + // or return this if some error happened during the execution + // (it's equivalent to returning int(1)) + // return Command::FAILURE; + abstract protected function command(): Command; + + public function fromArgv() + { + return $this->setInput(new ArgvInput()); + } + + public function fromStdin() + { + return $this->setInput(new ArrayInput($this->readStdin())); + } + + public function toConsole() + { + return $this->setOutput(new ConsoleOutput); + } + + public function toIRC() + { + return null; + } + + public function __construct(InputInterface $input = null, OutputInterface $output = null) + { + $this->setInput($input)->setOutput($output); + } + + public function setInput(InputInterface $input = null) + { + $this->input = $input; + + return $this; + } + + public function setOutput(OutputInterface $output = null) + { + $this->output = $output; + + return $this; + } + + public function run() + { + $this->application = new SymfonyApplication(); + $command = $this->command(); + + $this->application->add($command); + $this->application->setDefaultCommand($command->getName()); + $this->application->run($this->input, $this->output); + } + + protected function readStdin() + { + $stream = fopen("php://stdin", "r"); + $input_string = fgets($stream, 128); + $input_string = rtrim($input_string); + + $input_array = explode(' ', $input_string); + + fclose($stream); + + return $input_array; + } +} diff --git a/src/Command.php b/src/Command.php new file mode 100644 index 0000000..6fb3770 --- /dev/null +++ b/src/Command.php @@ -0,0 +1,21 @@ +<?php + +namespace FBeans\BlaIRC; + +use Closure; +use Symfony\Component\Console\Command\Command as SymfonyCommand; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +class Command extends SymfonyCommand +{ + protected function execute(InputInterface $input, OutputInterface $output) + { + return call_user_func($this->execute_callback, $input, $output); + } + + public function setExecuteCallback(Closure $callable) + { + $this->execute_callback = $callable; + } +} |