ConfigProvider::getContextConfig()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 5
dl 0
loc 10
ccs 6
cts 6
cp 1
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 2
crap 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Antidot\Queue\Container\Config;
6
7
use Antidot\Queue\Cli\StartQueueConsumer;
8
use Antidot\Queue\Container\ActionContainerFactory;
9
use Antidot\Queue\Container\ContextFactory;
10
use Antidot\Queue\Container\LoggerExtensionFactory;
11
use Antidot\Queue\Container\MessageProcessorFactory;
12
use Antidot\Queue\Container\ProducerFactory;
13
use Antidot\Queue\Container\QueueConsumerFactory;
14
use Antidot\Queue\Container\StartQueueConsumerFactory;
15
use Antidot\Queue\Producer;
16
use Assert\Assertion;
17
use Assert\AssertionFailedException;
18
use Enqueue\Consumption\Extension\LogExtension;
19
use Enqueue\Consumption\Extension\LoggerExtension;
20
use Enqueue\Consumption\Extension\SignalExtension;
21
use Enqueue\Consumption\QueueConsumerInterface;
22
use Enqueue\Null\NullContext;
23
use Interop\Queue\Context;
24
use Interop\Queue\Processor;
25
use InvalidArgumentException;
26
27
use function sprintf;
28
29
class ConfigProvider
30
{
31
    public const CONFIG_KEY = 'config';
32
    public const QUEUES_KEY = 'queues';
33
    public const CONTAINER_KEY = 'container';
34
    public const CONTEXTS_KEY = 'contexts';
35
    public const CONTEXT_SERVICE_KEY = 'context_service';
36
    public const CONTEXTS_TYPE_KEY = 'context_type';
37
    public const DEFAULT_CONTEXT_TYPE = 'null';
38
    public const DEFAULT_CONTEXT_KEY = 'default_context';
39
    public const EXTENSIONS_KEY = 'extensions';
40
    public const DEFAULT_CONTEXT = 'default';
41
    public const DEFAULT_CONTEXT_SERVICE = 'queue.context.default';
42
    public const DEFAULT_CONTAINER_SERVICE = 'queue.container.default';
43
    public const DEFAULT_EXTENSIONS = [
44
        LoggerExtension::class,
45
        SignalExtension::class,
46
        LogExtension::class,
47
    ];
48
    public const MESSAGE_TYPES_KEY = 'message_types';
49
    public const INVALID_CONFIG_ARRAY_MESSAGE = 'Value for key "%s" must be of type array.';
50
    public const MISSING_CONFIG_MESSAGE = 'Missing config required key "%s", see the docs for complete config.';
51
    public const INVALID_CONTEXT_MESSAGE = 'Given context "%s" is not properly defined in the config.';
52
    public const DEFAULT_CONFIG = [
53
        self::QUEUES_KEY => [
54
            self::DEFAULT_CONTEXT_KEY => self::DEFAULT_CONTEXT,
55
            self::CONTEXTS_KEY => [
56
                self::DEFAULT_CONTEXT => [
57
                    self::CONTEXTS_TYPE_KEY => self::DEFAULT_CONTEXT_TYPE,
58
                    self::CONTEXT_SERVICE_KEY => self::DEFAULT_CONTEXT_SERVICE,
59
                    self::CONTAINER_KEY => self::DEFAULT_CONTAINER_SERVICE,
60
                    self::EXTENSIONS_KEY => self::DEFAULT_EXTENSIONS,
61
                ],
62
            ],
63
        ],
64
        'factories' => [
65
            self::DEFAULT_CONTAINER_SERVICE => ActionContainerFactory::class,
66
            self::DEFAULT_CONTEXT_SERVICE => ContextFactory::class,
67
            Processor::class => MessageProcessorFactory::class,
68
            Producer::class => ProducerFactory::class,
69
            LoggerExtension::class => LoggerExtensionFactory::class,
70
        ],
71
        'services' => [
72
            Context::class => self::DEFAULT_CONTEXT_SERVICE,
73
            SignalExtension::class => SignalExtension::class,
74
            LogExtension::class => LogExtension::class,
75
        ],
76
        'console' => [
77
            'commands' => [
78
                StartQueueConsumer::NAME => StartQueueConsumer::class,
79
            ],
80
            'factories' => [
81
                StartQueueConsumer::class => StartQueueConsumerFactory::class,
82
                QueueConsumerInterface::class => QueueConsumerFactory::class,
83
            ],
84
        ],
85
    ];
86
87
    /**
88
     * @return array<mixed>
89
     */
90 1
    public function __invoke(): array
91
    {
92 1
        return self::DEFAULT_CONFIG;
93
    }
94
95
    /**
96
     * @param array<mixed> $config
97
     * @return array<mixed>
98
     * @throws AssertionFailedException
99
     */
100 13
    public static function getContextConfig(string $contextName, array $config): array
101
    {
102 13
        ConfigProvider::validate($config);
103
104 13
        $contextsConfig = $config[ConfigProvider::QUEUES_KEY][ConfigProvider::CONTEXTS_KEY];
105 13
        if (false === array_key_exists($contextName, $contextsConfig)) {
106 1
            throw new InvalidArgumentException(sprintf(ConfigProvider::INVALID_CONTEXT_MESSAGE, $contextName));
107
        }
108
109 12
        return $contextsConfig[$contextName];
110
    }
111
112
113
    /**
114
     * @param array<mixed> $config
115
     * @throws AssertionFailedException
116
     */
117 13
    public static function validate(array $config): void
118
    {
119 13
        Assertion::keyExists($config, self::QUEUES_KEY, sprintf(self::MISSING_CONFIG_MESSAGE, self::QUEUES_KEY));
120 13
        Assertion::isArray($config[self::QUEUES_KEY], sprintf(self::INVALID_CONFIG_ARRAY_MESSAGE, self::QUEUES_KEY));
121 13
        Assertion::keyExists(
122 13
            $config[self::QUEUES_KEY],
123 13
            self::CONTEXTS_KEY,
124 13
            sprintf(self::MISSING_CONFIG_MESSAGE, self::CONTEXTS_KEY)
125
        );
126 13
    }
127
}
128