Failed Conditions
Pull Request — master (#75)
by Yo
02:31
created

JsonRpcMethodDefinitionHelper   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 55
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 7
eloc 21
dl 0
loc 55
ccs 0
cts 17
cp 0
rs 10
c 1
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A findAndValidateJsonRpcMethodDefinition() 0 17 3
A validateJsonRpcMethodDefinition() 0 7 2
A validateJsonRpcMethodTagAttributes() 0 8 2
1
<?php
2
namespace Yoanm\SymfonyJsonRpcHttpServer\DependencyInjection;
3
4
use Symfony\Component\DependencyInjection\ContainerBuilder;
5
use Symfony\Component\DependencyInjection\Definition;
6
use Symfony\Component\DependencyInjection\Exception\LogicException;
7
use Yoanm\JsonRpcServer\Domain\JsonRpcMethodInterface;
8
9
/**
10
 * Class JsonRpcMethodDefinitionHelper
11
 */
12
class JsonRpcMethodDefinitionHelper
13
{
14
    /**
15
     * @param ContainerBuilder $container
16
     *
17
     * @return array
18
     */
19
    public function findAndValidateJsonRpcMethodDefinition(ContainerBuilder $container) : array
20
    {
21
        $definitionList = [];
22
23
        $taggedServiceList = $container->findTaggedServiceIds(JsonRpcHttpServerExtension::JSONRPC_METHOD_TAG);
24
25
        foreach ($taggedServiceList as $serviceId => $tagAttributeList) {
26
            $this->validateJsonRpcMethodDefinition($serviceId, $container->getDefinition($serviceId));
27
28
            foreach ($tagAttributeList as $tagAttributeKey => $tagAttributeData) {
29
                $this->validateJsonRpcMethodTagAttributes($serviceId, $tagAttributeData);
30
                $methodName = $tagAttributeData[JsonRpcHttpServerExtension::JSONRPC_METHOD_TAG_METHOD_NAME_KEY];
31
                $definitionList[$serviceId][] = $methodName;
32
            }
33
        }
34
35
        return $definitionList;
36
    }
37
38
    /**
39
     * @param string $serviceId
40
     * @param array  $tagAttributeData
41
     */
42
    private function validateJsonRpcMethodTagAttributes(string $serviceId, array $tagAttributeData) : void
43
    {
44
        if (!isset($tagAttributeData[JsonRpcHttpServerExtension::JSONRPC_METHOD_TAG_METHOD_NAME_KEY])) {
45
            throw new LogicException(sprintf(
46
                'Service "%s" is taggued as JSON-RPC method but does not have'
47
                . ' method name defined under "%s" tag attribute key',
48
                $serviceId,
49
                JsonRpcHttpServerExtension::JSONRPC_METHOD_TAG_METHOD_NAME_KEY
50
            ));
51
        }
52
    }
53
54
    /**
55
     * @param string     $serviceId
56
     * @param Definition $definition
57
     *
58
     * @throws \LogicException      In case definition is not valid
59
     */
60
    private function validateJsonRpcMethodDefinition(string $serviceId, Definition $definition) : void
61
    {
62
        if (!in_array(JsonRpcMethodInterface::class, class_implements($definition->getClass()))) {
63
            throw new LogicException(sprintf(
64
                'Service "%s" is taggued as JSON-RPC method but does not implement %s',
65
                $serviceId,
66
                JsonRpcMethodInterface::class
67
            ));
68
        }
69
    }
70
}
71