addOption( name: 'config-file', shortcut: ['c'], mode: InputOption::VALUE_REQUIRED, description: 'The path to the project\'s build.yaml file', default: 'build.yaml', ) ->addOption( name: 'output-dir', shortcut: ['o'], mode: InputOption::VALUE_REQUIRED, description: 'The directory to create files in', default: '.', ) ; } protected function execute(InputInterface $input, OutputInterface $output): int { $io = new SymfonyStyle($input, $output); $configFile = $input->getOption(name: 'config-file'); $outputDir = $input->getOption(name: 'output-dir'); $pipes = [ new CreateFinalConfigurationData(), new ValidateBuildConfigurationData(), new CreateListOfFilesToGenerate(), new GenerateConfigurationFiles( $this->filesystem, $this->twig, $outputDir, ), ]; /** * @var Collection $generatedFiles * @var array $configurationData */ [$configurationData, $generatedFiles] = (new Pipeline()) ->send($configFile) ->through($pipes) ->thenReturn(); $io->info("Building configuration for {$configurationData['name']}."); $io->write('Generated files:'); $io->listing(static::getListOfFiles(filesToGenerate: $generatedFiles)->toArray()); return Command::SUCCESS; } private static function buildFilePath(TemplateFile $templateFile): string { return collect([$templateFile->path, $templateFile->name])->filter()->implode('/'); } private static function getListOfFiles(Collection $filesToGenerate): Collection { return $filesToGenerate ->map(fn (TemplateFile $templateFile): string => static::buildFilePath($templateFile)) ->unique() ->sort(); } }