sandrokeil /
interop-config
| 1 | <?php |
||
| 2 | /** |
||
| 3 | * Sandro Keil (https://sandro-keil.de) |
||
| 4 | * |
||
| 5 | * @link http://github.com/sandrokeil/interop-config for the canonical source repository |
||
| 6 | * @copyright Copyright (c) 2017-2020 Sandro Keil |
||
| 7 | * @license http://github.com/sandrokeil/interop-config/blob/master/LICENSE.md New BSD License |
||
| 8 | */ |
||
| 9 | |||
| 10 | namespace Interop\Config\Tool; |
||
| 11 | |||
| 12 | use Interop\Config\RequiresConfig; |
||
| 13 | |||
| 14 | abstract class AbstractCommand |
||
| 15 | { |
||
| 16 | const COMMAND_DUMP = 'dump'; |
||
| 17 | const COMMAND_ERROR = 'error'; |
||
| 18 | const COMMAND_HELP = 'help'; |
||
| 19 | |||
| 20 | /** |
||
| 21 | * @var ConsoleHelper |
||
| 22 | */ |
||
| 23 | protected $helper; |
||
| 24 | |||
| 25 | 19 | public function __construct(ConsoleHelper $helper = null) |
|
| 26 | { |
||
| 27 | 19 | $this->helper = $helper ?: new ConsoleHelper(); |
|
| 28 | 19 | } |
|
| 29 | |||
| 30 | 13 | protected function help($resource = STDOUT): void |
|
|
0 ignored issues
–
show
|
|||
| 31 | { |
||
| 32 | 13 | $this->helper->writeErrorMessage(sprintf(static::HELP_TEMPLATE, static::COMMAND_CLI_NAME)); |
|
|
0 ignored issues
–
show
|
|||
| 33 | 13 | } |
|
| 34 | |||
| 35 | /** |
||
| 36 | * @param string $command |
||
| 37 | * @param string $configFile File from which config originates, and to |
||
| 38 | * which it will be written. |
||
| 39 | * @param array $config Parsed configuration. |
||
| 40 | * @param string $class Name of class to reflect. |
||
| 41 | * @return \stdClass |
||
| 42 | */ |
||
| 43 | 6 | protected function createArguments(string $command, string $configFile, array $config, string $class): \stdClass |
|
| 44 | { |
||
| 45 | return (object)[ |
||
| 46 | 6 | 'command' => $command, |
|
| 47 | 6 | 'configFile' => $configFile, |
|
| 48 | 6 | 'config' => $config, |
|
| 49 | 6 | 'class' => $class, |
|
| 50 | ]; |
||
| 51 | } |
||
| 52 | |||
| 53 | 9 | protected function createErrorArgument(string $message): \stdClass |
|
| 54 | { |
||
| 55 | return (object)[ |
||
| 56 | 9 | 'command' => static::COMMAND_ERROR, |
|
| 57 | 9 | 'message' => $message, |
|
| 58 | ]; |
||
| 59 | } |
||
| 60 | |||
| 61 | 4 | protected function createHelpArgument(): \stdClass |
|
| 62 | { |
||
| 63 | return (object)[ |
||
| 64 | 4 | 'command' => static::COMMAND_HELP, |
|
| 65 | ]; |
||
| 66 | } |
||
| 67 | |||
| 68 | 19 | protected function parseArgs(array $args): \stdClass |
|
| 69 | { |
||
| 70 | 19 | if (!count($args)) { |
|
| 71 | 2 | return $this->createHelpArgument(); |
|
| 72 | } |
||
| 73 | |||
| 74 | 17 | $arg1 = array_shift($args); |
|
| 75 | |||
| 76 | 17 | if (in_array($arg1, ['-h', '--help', 'help'], true)) { |
|
| 77 | 2 | return $this->createHelpArgument(); |
|
| 78 | } |
||
| 79 | |||
| 80 | 15 | if (!count($args)) { |
|
| 81 | 2 | return $this->createErrorArgument('<error>Missing class name</error>'); |
|
| 82 | } |
||
| 83 | |||
| 84 | 13 | $class = array_shift($args); |
|
| 85 | |||
| 86 | 13 | if (!class_exists($class)) { |
|
| 87 | 2 | return $this->createErrorArgument( |
|
| 88 | 2 | sprintf('<error>Class "%s" does not exist or could not be autoloaded.</error>', $class) |
|
| 89 | ); |
||
| 90 | } |
||
| 91 | |||
| 92 | 11 | $reflectionClass = new \ReflectionClass($class); |
|
| 93 | |||
| 94 | 11 | if (!in_array(RequiresConfig::class, $reflectionClass->getInterfaceNames(), true)) { |
|
| 95 | 2 | return $this->createErrorArgument( |
|
| 96 | 2 | sprintf('<error>Class "%s" does not implement "%s".</error>', $class, RequiresConfig::class) |
|
| 97 | ); |
||
| 98 | } |
||
| 99 | |||
| 100 | 9 | $configFile = $arg1; |
|
| 101 | 9 | switch (file_exists($configFile)) { |
|
| 102 | case true: |
||
| 103 | 6 | $config = require $configFile; |
|
| 104 | |||
| 105 | 6 | if ($config instanceof \Iterator) { |
|
| 106 | 1 | $config = iterator_to_array($config); |
|
| 107 | 5 | } elseif ($config instanceof \IteratorAggregate) { |
|
| 108 | 1 | $config = iterator_to_array($config->getIterator()); |
|
| 109 | } |
||
| 110 | |||
| 111 | 6 | if (!is_array($config)) { |
|
| 112 | 1 | return $this->createErrorArgument( |
|
| 113 | 1 | sprintf('<error>Configuration at path "%s" does not return an array.</error>', $configFile) |
|
| 114 | ); |
||
| 115 | } |
||
| 116 | |||
| 117 | 5 | break; |
|
| 118 | 3 | case false: |
|
| 119 | // fall-through |
||
| 120 | default: |
||
| 121 | 3 | if ($command = $this->checkFile($configFile)) { |
|
| 122 | 2 | return $command; |
|
| 123 | } |
||
| 124 | |||
| 125 | 1 | $config = []; |
|
| 126 | 1 | break; |
|
| 127 | } |
||
| 128 | |||
| 129 | 6 | return $this->createArguments(self::COMMAND_DUMP, $configFile, $config, $class); |
|
| 130 | } |
||
| 131 | |||
| 132 | abstract protected function checkFile(string $configFile): ?\stdClass; |
||
| 133 | } |
||
| 134 |
This check looks for parameters that have been defined for a function or method, but which are not used in the method body.