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

DependencyBuilder::buildParameters()   B

Complexity

Conditions 8
Paths 6

Size

Total Lines 22
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 15
CRAP Score 8.0155

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 8
eloc 16
c 1
b 0
f 0
nc 6
nop 1
dl 0
loc 22
ccs 15
cts 16
cp 0.9375
crap 8.0155
rs 8.4444
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