Completed
Push — master ( 8fb63d...790faa )
by Andrey
02:31
created

DependencyBuilder::buildParameter()   B

Complexity

Conditions 7
Paths 5

Size

Total Lines 16
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 7.0222

Importance

Changes 0
Metric Value
cc 7
eloc 12
c 0
b 0
f 0
nc 5
nop 1
dl 0
loc 16
ccs 12
cts 13
cp 0.9231
crap 7.0222
rs 8.8333
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
12
class DependencyBuilder
13
{
14
    /**
15
     * @var ItemProvider
16
     */
17
    private $itemProvider;
18
    /**
19
     * @var ClassItemBuilder
20
     */
21
    private $classItemBuilder;
22
23 12
    public function __construct(ItemProvider $itemProvider, ClassItemBuilder $classItemBuilder)
24
    {
25 12
        $this->itemProvider = $itemProvider;
26 12
        $this->classItemBuilder = $classItemBuilder;
27 12
    }
28
29
    /**
30
     * @param \ReflectionParameter[] $parameters
31
     *
32
     * @throws ContainerException
33
     */
34 12
    public function buildParameters(array $parameters): array
35
    {
36 12
        $args = [];
37 12
        foreach ($parameters as $parameter) {
38 12
            $args[] = $this->buildParameter($parameter);
39
        }
40
41 11
        return $args;
42
    }
43
44 5
    private function resolveVariadic(\ReflectionParameter $parameter): AutowireItemInterface
45
    {
46 5
        if ($parameter->getClass()) {
47 5
            $variadicItem = new VariadicItem();
48 5
            $this->itemProvider->getVariadicPass()->addItem($parameter->getClass()->getName(), $variadicItem);
49
50 5
            return $variadicItem;
51
        } else {
52 4
            return new DefaultValueItem(null);
53
        }
54
    }
55
56 12
    private function buildParameter(\ReflectionParameter $parameter): AutowireItemInterface
57
    {
58 12
        if ($parameter->getType() && $parameter->getType()->isBuiltin()) {
59 8
            return new BuiltInTypeItem(
60 8
                $parameter->getName(),
61 8
                $parameter->isDefaultValueAvailable(),
62 8
                $parameter->isDefaultValueAvailable() ? $parameter->getDefaultValue() : null
63
            );
64 8
        } elseif ($parameter->isVariadic()) {
65 5
            return $this->resolveVariadic($parameter);
66 7
        } elseif ($parameter->isDefaultValueAvailable()) {
67 4
            return new DefaultValueItem($parameter->getDefaultValue());
68 7
        } elseif ($parameter->getClass()) {
69 7
            return $this->classItemBuilder->build($parameter->getClass()->getName());
70
        }
71
        throw new ContainerException(sprintf('Unable to autowire parameter %s', $parameter->getName()));
72
    }
73
}
74