Completed
Push — master ( 1a6c14...1a0ee4 )
by Andrey
02:15
created

DependencyBuilder   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 56
Duplicated Lines 0 %

Test Coverage

Coverage 96.15%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 27
c 1
b 0
f 0
dl 0
loc 56
ccs 25
cts 26
cp 0.9615
rs 10
wmc 11

3 Methods

Rating   Name   Duplication   Size   Complexity  
A resolveVariadic() 0 8 2
A __construct() 0 4 1
B buildParameters() 0 22 8
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Borodulin\Container\Autowire;
6
7
use Borodulin\Container\Autowire\Item\BuiltInTypeItem;
8
use Borodulin\Container\Autowire\Item\DefaultValueItem;
9
use Borodulin\Container\Autowire\Item\VariadicItem;
10
use Borodulin\Container\ContainerException;
11
use Borodulin\Container\NotFoundException;
12
13
class DependencyBuilder
14
{
15
    /**
16
     * @var ItemProvider
17
     */
18
    private $itemProvider;
19
    /**
20
     * @var ClassItemBuilder
21
     */
22
    private $classItemBuilder;
23
24 12
    public function __construct(ItemProvider $itemProvider, ClassItemBuilder $classItemBuilder)
25
    {
26 12
        $this->itemProvider = $itemProvider;
27 12
        $this->classItemBuilder = $classItemBuilder;
28 12
    }
29
30
    /**
31
     * @param \ReflectionParameter[] $parameters
32
     *
33
     * @throws ContainerException
34
     * @throws NotFoundException
35
     * @throws \ReflectionException
36
     */
37 12
    public function buildParameters(array $parameters): array
38
    {
39 12
        $args = [];
40 12
        foreach ($parameters as $parameter) {
41 12
            if ($parameter->getType() && $parameter->getType()->isBuiltin()) {
42 8
                $args[] = new BuiltInTypeItem(
43 8
                    $parameter->getName(),
44 8
                    $parameter->isDefaultValueAvailable(),
45 8
                    $parameter->isDefaultValueAvailable() ? $parameter->getDefaultValue() : null
46
                );
47 8
            } elseif ($parameter->isVariadic()) {
48 5
                $args[] = $this->resolveVariadic($parameter);
49 7
            } elseif ($parameter->isDefaultValueAvailable()) {
50 4
                $args[] = new DefaultValueItem($parameter->getDefaultValue());
51 7
            } elseif ($parameter->getClass()) {
52 7
                $args[] = $this->classItemBuilder->build($parameter->getClass()->getName());
53
            } else {
54
                throw new ContainerException(sprintf('Unable to autowire parameter %s', $parameter->getName()));
55
            }
56
        }
57
58 11
        return $args;
59
    }
60
61 5
    private function resolveVariadic(\ReflectionParameter $parameter): AutowireItemInterface
62
    {
63 5
        if ($parameter->getClass()) {
64 5
            $variadicItem = new VariadicItem();
65 5
            $this->itemProvider->getVariadicPass()->addItem($parameter->getClass()->getName(), $variadicItem);
66 5
            return $variadicItem;
67
        } else {
68 4
            return new DefaultValueItem(null);
69
        }
70
    }
71
}
72