Th3Mouk /
OpenAPIGenerator
| 1 | <?php |
||
| 2 | |||
| 3 | declare(strict_types=1); |
||
| 4 | |||
| 5 | namespace Th3Mouk\OpenAPIGenerator\Command; |
||
| 6 | |||
| 7 | use Symfony\Component\Console\Command\Command; |
||
| 8 | use Symfony\Component\Console\Input\InputArgument; |
||
| 9 | use Symfony\Component\Console\Input\InputInterface; |
||
| 10 | use Symfony\Component\Console\Input\InputOption; |
||
| 11 | use Symfony\Component\Console\Output\OutputInterface; |
||
| 12 | use Symfony\Component\Finder\Finder; |
||
| 13 | use Symfony\Component\Yaml\Yaml; |
||
| 14 | use Th3Mouk\OpenAPIGenerator\PathHelper; |
||
| 15 | use Traversable; |
||
| 16 | |||
| 17 | final class GenerateCommand extends Command |
||
| 18 | { |
||
| 19 | protected function configure(): void |
||
| 20 | { |
||
| 21 | $this |
||
| 22 | ->setName('generate') |
||
| 23 | ->setDescription('Generate the openapi.json') |
||
| 24 | ->addArgument('path', InputArgument::OPTIONAL, 'The path where generate the openapi.json file', '') |
||
| 25 | ->addOption('pretty-json', 'p', InputOption::VALUE_NONE, 'Generate json file in pretty format'); |
||
| 26 | } |
||
| 27 | |||
| 28 | protected function execute(InputInterface $input, OutputInterface $output): int |
||
| 29 | { |
||
| 30 | $this->generateJson($input); |
||
| 31 | echo 'generated' . PHP_EOL; |
||
| 32 | |||
| 33 | return 0; |
||
| 34 | } |
||
| 35 | |||
| 36 | private function generateJson(InputInterface $input): void |
||
| 37 | { |
||
| 38 | $template_file = (new Finder()) |
||
| 39 | ->in(getRootPath() . PathHelper::ROOT) |
||
| 40 | ->files() |
||
| 41 | ->name('openapi.yaml'); |
||
| 42 | |||
| 43 | if (!$template_file->hasResults()) { |
||
| 44 | echo 'no openapi.yaml file found' . PHP_EOL; |
||
| 45 | |||
| 46 | return; |
||
| 47 | } |
||
| 48 | |||
| 49 | $template = $this->getFirstElementOfFileIterator($template_file); |
||
|
0 ignored issues
–
show
|
|||
| 50 | |||
| 51 | $template = Yaml::parse($template->getContents()); |
||
| 52 | $components = $template['components'] ?? []; |
||
| 53 | |||
| 54 | $node_compactor = static fn (Traversable $node_iterator) => array_reduce( |
||
| 55 | iterator_to_array($node_iterator), |
||
| 56 | static fn ($carry, $item) => array_merge($carry, $item), |
||
| 57 | [], |
||
| 58 | ); |
||
| 59 | |||
| 60 | $components['schemas'] = (object) $node_compactor($this->getContentGenerator(PathHelper::SCHEMAS)); |
||
| 61 | $components['responses'] = (object) $node_compactor($this->getContentGenerator(PathHelper::RESPONSES)); |
||
| 62 | $components['parameters'] = (object) $node_compactor($this->getContentGenerator(PathHelper::PARAMETERS)); |
||
| 63 | $components['examples'] = (object) $node_compactor($this->getContentGenerator(PathHelper::EXAMPLES)); |
||
| 64 | $components['requestBodies'] = (object) $node_compactor($this->getContentGenerator(PathHelper::REQUEST_BODIES)); |
||
| 65 | $components['headers'] = (object) $node_compactor($this->getContentGenerator(PathHelper::HEADERS)); |
||
| 66 | $components['securitySchemes'] = (object) $node_compactor($this->getContentGenerator(PathHelper::SECURITY_SCHEMES)); |
||
| 67 | $components['links'] = (object) $node_compactor($this->getContentGenerator(PathHelper::LINKS)); |
||
| 68 | $components['callbacks'] = (object) $node_compactor($this->getContentGenerator(PathHelper::CALLBACKS)); |
||
| 69 | |||
| 70 | $template['paths'] = (object) $node_compactor($this->getContentGenerator(PathHelper::PATHS)); |
||
| 71 | $template['components'] = (object) $components; |
||
| 72 | |||
| 73 | $arg_path = $input->getArgument('path'); |
||
| 74 | |||
| 75 | if (!is_string($arg_path)) { |
||
| 76 | throw new \RuntimeException('Path argument must be a string'); |
||
| 77 | } |
||
| 78 | |||
| 79 | $path = '/' !== substr($arg_path, 0, 1) ? '/' . $arg_path : $arg_path; |
||
| 80 | |||
| 81 | $openapi_file_path = getRootPath() . $path . '/openapi.json'; |
||
| 82 | if (!$file = fopen($openapi_file_path, 'w')) { |
||
| 83 | echo 'error generating openapi.json file' . PHP_EOL; |
||
| 84 | |||
| 85 | return; |
||
| 86 | } |
||
| 87 | |||
| 88 | if ($input->getOption('pretty-json')) { |
||
| 89 | fwrite($file, \json_encode($template, JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT)); |
||
| 90 | fclose($file); |
||
| 91 | |||
| 92 | return; |
||
| 93 | } |
||
| 94 | |||
| 95 | fwrite($file, \json_encode($template, JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR)); |
||
| 96 | fclose($file); |
||
| 97 | } |
||
| 98 | |||
| 99 | /** |
||
| 100 | * @return \Generator<mixed> |
||
| 101 | */ |
||
| 102 | private function getContentGenerator(string $path): \Generator |
||
| 103 | { |
||
| 104 | foreach ((new Finder())->files()->in(getRootPath() . $path)->name('*.yaml') as $file) { |
||
| 105 | yield Yaml::parse($file->getContents()); |
||
| 106 | } |
||
| 107 | } |
||
| 108 | |||
| 109 | /** |
||
| 110 | * @return mixed|null |
||
| 111 | */ |
||
| 112 | private function getFirstElementOfFileIterator(Finder $iterator) |
||
| 113 | { |
||
| 114 | foreach ($iterator as $element) { |
||
| 115 | return $element; |
||
| 116 | } |
||
| 117 | |||
| 118 | return null; |
||
| 119 | } |
||
| 120 | } |
||
| 121 |
This check looks for function or method calls that always return null and whose return value is assigned to a variable.
The method
getObject()can return nothing but null, so it makes no sense to assign that value to a variable.The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.