OptionProviderAutomation   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 69
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 26
dl 0
loc 69
rs 10
c 0
b 0
f 0
wmc 9

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 1
A getSubscribedEvents() 0 6 1
A onCommandConfigure() 0 8 2
A onCommandInteract() 0 8 2
A onCommandInitialize() 0 11 3
1
<?php declare(strict_types=1);
2
3
namespace Cocotte\Console;
4
5
use Cocotte\Environment\EnvironmentState;
6
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
7
8
final class OptionProviderAutomation implements EventSubscriberInterface
9
{
10
    /**
11
     * @var OptionProviderRegistry
12
     */
13
    private $registry;
14
15
    /**
16
     * @var InteractionOperator
17
     */
18
    private $operator;
19
    /**
20
     * @var EnvironmentState
21
     */
22
    private $environmentState;
23
24
    public function __construct(
25
        OptionProviderRegistry $registry,
26
        InteractionOperator $operator,
27
        EnvironmentState $environmentState
28
    ) {
29
        $this->registry = $registry;
30
        $this->operator = $operator;
31
        $this->environmentState = $environmentState;
32
    }
33
34
    public static function getSubscribedEvents()
35
    {
36
        return [
37
            CommandEventStore::COMMAND_CONFIGURE => 'onCommandConfigure',
38
            CommandEventStore::COMMAND_INITIALIZE => 'onCommandInitialize',
39
            CommandEventStore::COMMAND_INTERACT => 'onCommandInteract',
40
        ];
41
    }
42
43
    public function onCommandConfigure(CommandConfigureEvent $event)
44
    {
45
        $command = $event->command();
46
47
        foreach ($command->optionProviders() as $className) {
48
            $optionProvider = $this->registry->providerByClassName($className);
49
50
            $event->inputDefinition()->addOption($optionProvider->option($this->environmentState));
51
        }
52
    }
53
54
    public function onCommandInitialize(CommandInitializeEvent $event)
55
    {
56
        $command = $event->command();
57
        $input = $event->input();
58
59
        foreach ($command->optionProviders() as $className) {
60
            $optionProvider = $this->registry->providerByClassName($className);
61
62
            $value = $input->getOption($optionProvider->optionName());
63
            if (is_string($value)) {
64
                $optionProvider->validate($value);
65
            }
66
        }
67
    }
68
69
    public function onCommandInteract(CommandInteractEvent $event)
70
    {
71
        $command = $event->command();
72
73
        foreach ($command->optionProviders() as $className) {
74
            $optionProvider = $this->registry->providerByClassName($className);
75
76
            $this->operator->interact($event->input(), $optionProvider);
77
        }
78
    }
79
}
80