Passed
Push — master ( ee13c0...fd5ab9 )
by Koldo
02:31
created

MakerCommandFactory::__invoke()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 9
nc 1
nop 2
dl 0
loc 12
ccs 0
cts 11
cp 0
crap 2
rs 9.9666
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Antidot\DevTools\Container;
6
7
use Antidot\DevTools\Application\Command\AbstractMakerCommand;
8
use Antidot\DevTools\Application\Command\MakeConsoleCommand;
9
use Antidot\DevTools\Application\Command\MakeEvent;
10
use Antidot\DevTools\Application\Command\MakeEventListener;
11
use Antidot\DevTools\Application\Command\MakeFactory;
12
use Antidot\DevTools\Application\Command\MakeMiddleware;
13
use Antidot\DevTools\Application\Command\MakeRequestHandler;
14
use Antidot\DevTools\Application\Service\CreateClassFile;
15
use Antidot\DevTools\Application\Service\GetClassNameFromFQCN;
16
use Antidot\DevTools\Application\Service\GetNamespaceFromFQCN;
17
use Antidot\DevTools\Application\Service\GetRealPathFromNamespace;
18
use InvalidArgumentException;
19
use Psr\Container\ContainerInterface;
20
21
use function implode;
22
use function in_array;
23
use function sprintf;
24
25
class MakerCommandFactory
26
{
27
    private const COMMANDS = [
28
        MakeConsoleCommand::class,
29
        MakeEvent::class,
30
        MakeEventListener::class,
31
        MakeFactory::class,
32
        MakeRequestHandler::class,
33
        MakeMiddleware::class,
34
    ];
35
36
    public function __invoke(ContainerInterface $container, string $makerName): AbstractMakerCommand
37
    {
38
        $this->assertValidMaker($makerName);
39
        $getClassNameFromFQCN = new GetClassNameFromFQCN;
40
        $getNamespaceFromFQCN = new GetNamespaceFromFQCN;
41
42
        return new $makerName(
43
            $getClassNameFromFQCN,
44
            $getNamespaceFromFQCN,
45
            new GetRealPathFromNamespace($getClassNameFromFQCN, $getNamespaceFromFQCN),
46
            new CreateClassFile,
47
            (array)$container->get('config')
48
        );
49
    }
50
51
    private function assertValidMaker(string $makerName): void
52
    {
53
        if (false === in_array($makerName, self::COMMANDS, true)) {
54
            throw new InvalidArgumentException(sprintf(
55
                '$makerName must be one of available Makers: %s. %s given.',
56
                implode(',', self::COMMANDS),
57
                $makerName
58
            ));
59
        }
60
    }
61
}
62