Skip to content
Snippets Groups Projects
Verified Commit d29bbd8f authored by Jiří Pudil's avatar Jiří Pudil
Browse files

extract logic from commands to services

parent 3472e876
No related branches found
No related tags found
1 merge request!53Check command
......@@ -40,7 +40,7 @@ final class CheckCommand extends ScaffolderCommand
$output->writeln(\sprintf('Checking %d definition file%s:%s', $total, $total !== 1 ? 's' : '', \PHP_EOL));
foreach ($definitionFiles as $definitionFile) {
$results[] = $result = $this->checkFile($definitionFile);
$results[] = $result = $this->processFile($definitionFile, $input);
if ($result->isSuccessful()) {
$output->write('.');
......@@ -61,28 +61,10 @@ final class CheckCommand extends ScaffolderCommand
return (int) ! $isSuccess;
}
private function checkFile(
DefinitionFile $definitionFile,
): FileResult
{
try {
$definitions = $definitionFile->load();
} catch (\Throwable $error) {
return new FileResult($definitionFile, $error);
}
$result = new FileResult($definitionFile, null);
foreach ($definitions as $definition) {
$definitionResult = $this->checkDefinition($definition, $definitionFile);
$result->addDefinition($definitionResult);
}
return $result;
}
private function checkDefinition(
protected function processDefinition(
ClassDefinition $definition,
DefinitionFile $definitionFile,
InputInterface $input,
): DefinitionResult
{
try {
......
......@@ -64,27 +64,7 @@ final class ScaffoldCommand extends ScaffolderCommand
return (int) ! $isSuccess;
}
private function processFile(
DefinitionFile $definitionFile,
InputInterface $input,
): FileResult
{
try {
$definitions = $definitionFile->load();
} catch (\Throwable $error) {
return new FileResult($definitionFile, $error);
}
$result = new FileResult($definitionFile, null);
foreach ($definitions as $definition) {
$definitionResult = $this->generateClass($definition, $definitionFile, $input);
$result->addDefinition($definitionResult);
}
return $result;
}
private function generateClass(
protected function processDefinition(
ClassDefinition $definition,
DefinitionFile $definitionFile,
InputInterface $input,
......
......@@ -5,10 +5,12 @@ declare(strict_types=1);
namespace Grifart\ClassScaffolder\Console;
use Grifart\ClassScaffolder\ClassGenerator;
use Grifart\ClassScaffolder\Definition\ClassDefinition;
use Grifart\ClassScaffolder\DefinitionFile;
use Grifart\ClassScaffolder\DefinitionFilesLocator;
use Grifart\ClassScaffolder\DefinitionResult;
use Grifart\ClassScaffolder\FileProcessor;
use Grifart\ClassScaffolder\FileResult;
use Nette\Utils\Finder;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
......@@ -23,12 +25,16 @@ abstract class ScaffolderCommand extends Command
private const OPTION_SEARCH_PATTERN = 'search-pattern';
protected ClassGenerator $classGenerator;
private DefinitionFilesLocator $definitionFilesLocator;
private FileProcessor $fileProcessor;
protected SymfonyStyle $style;
public function __construct()
{
parent::__construct();
$this->classGenerator = new ClassGenerator();
$this->definitionFilesLocator = new DefinitionFilesLocator();
$this->fileProcessor = new FileProcessor();
}
protected function initialize(InputInterface $input, OutputInterface $output): void
......@@ -52,22 +58,26 @@ abstract class ScaffolderCommand extends Command
$path = $this->getDefinitionPath($input);
$searchPattern = $this->getSearchPattern($input);
$result = [];
if (\is_dir($path)) {
$files = Finder::find($searchPattern)->from($path);
foreach ($files as $file) {
$result[] = DefinitionFile::from($file->getPathname());
}
} elseif (\is_file($path)) {
$result[] = DefinitionFile::from($path);
} else {
throw new \RuntimeException('Given path is neither a file nor a directory.');
}
return $this->definitionFilesLocator->locateDefinitionFiles($path, $searchPattern);
}
return $result;
protected function processFile(
DefinitionFile $definitionFile,
InputInterface $input,
): FileResult
{
return $this->fileProcessor->processFile(
$definitionFile,
fn(ClassDefinition $definition) => $this->processDefinition($definition, $definitionFile, $input),
);
}
abstract protected function processDefinition(
ClassDefinition $definition,
DefinitionFile $definitionFile,
InputInterface $input,
): DefinitionResult;
protected function printError(\Throwable $error, OutputInterface $output): void
{
$this->style->error([
......
<?php
declare(strict_types=1);
namespace Grifart\ClassScaffolder;
use Nette\Utils\Finder;
final class DefinitionFilesLocator
{
/**
* @return DefinitionFile[]
*/
public function locateDefinitionFiles(
string $path,
string $searchPattern,
): array
{
$result = [];
if (\is_dir($path)) {
$files = Finder::find($searchPattern)->from($path);
foreach ($files as $file) {
$result[] = DefinitionFile::from($file->getPathname());
}
} elseif (\is_file($path)) {
$result[] = DefinitionFile::from($path);
} else {
throw new \RuntimeException('Given path is neither a file nor a directory.');
}
return $result;
}
}
<?php
declare(strict_types=1);
namespace Grifart\ClassScaffolder;
final class FileProcessor
{
/**
* @param (\Closure(Definition\ClassDefinition): DefinitionResult) $processDefinition
*/
public function processFile(
DefinitionFile $definitionFile,
\Closure $processDefinition,
): FileResult
{
try {
$definitions = $definitionFile->load();
} catch (\Throwable $error) {
return new FileResult($definitionFile, $error);
}
$result = new FileResult($definitionFile, null);
foreach ($definitions as $definition) {
try {
$definitionResult = $processDefinition($definition);
$result->addDefinition($definitionResult);
} catch (\Throwable $error) {
$result->addDefinition(DefinitionResult::error($definition, $error));
}
}
return $result;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment