Invokable::create()   A
last analyzed

Complexity

Conditions 4
Paths 5

Size

Total Lines 24
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 4.128

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
eloc 13
c 1
b 0
f 0
nc 5
nop 2
dl 0
loc 24
ccs 8
cts 10
cp 0.8
crap 4.128
rs 9.8333
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Knp\DictionaryBundle\Dictionary\Factory;
6
7
use InvalidArgumentException;
8
use Knp\DictionaryBundle\Dictionary;
9
use Knp\DictionaryBundle\Dictionary\Factory;
10
use Psr\Container\ContainerInterface;
11
12
final class Invokable implements Factory
13
{
14
    public function __construct(private readonly ContainerInterface $container) {}
15
16
    /**
17
     * {@inheritdoc}
18
     *
19 4
     * @throw InvalidArgumentException if there is some problem with the config.
20
     */
21 4
    public function create(string $name, array $config): Dictionary
22 4
    {
23
        if (!isset($config['service'])) {
24
            throw new \InvalidArgumentException(\sprintf(
25
                'The "service" config key must be set for the dictionary named "%s".',
26
                $name
27
            ));
28
        }
29 1
30
        $service  = $this->container->get($config['service']);
31 1
        $callable = [$service];
32
33
        if (isset($config['method'])) {
34
            $callable[] = $config['method'];
35
        }
36
37
        if (!\is_callable($callable)) {
38 1
            throw new \InvalidArgumentException(\sprintf(
39 1
                'You must provide a valid callable for the dictionary named "%s".',
40
                $name
41 1
            ));
42 1
        }
43
44
        return new Dictionary\Invokable($name, $callable);
45 1
    }
46
47
    public function supports(array $config): bool
48
    {
49
        return isset($config['type']) && 'callable' === $config['type'];
50
    }
51
}
52