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

DependencyBuilder::resolveVariadic()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 6
c 1
b 0
f 0
nc 2
nop 1
dl 0
loc 8
ccs 6
cts 6
cp 1
crap 2
rs 10
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