InstanceArgumentResolver::findByPath()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
ccs 0
cts 2
cp 0
crap 2
rs 10
c 0
b 0
f 0
1
<?php declare(strict_types=1);
2
3
namespace Diezz\YamlToObjectMapper\Resolver;
4
5
use Diezz\YamlToObjectMapper\ClassField;
6
use Diezz\YamlToObjectMapper\ClassInfo;
7
8
class InstanceArgumentResolver extends SystemArgumentResolver
9
{
10
    private ClassInfo $classInfo;
11
    private array $config;
12
13
    /**
14
     * @param ClassInfo $classInfo
15
     * @param array     $config
16
     */
17 2
    public function __construct(ClassInfo $classInfo, array $config)
18
    {
19 2
        $this->classInfo = $classInfo;
20 2
        $this->config = $config;
21 2
    }
22
23 2
    protected function doResolve($context = null)
24
    {
25 2
        $className = $this->classInfo->getClassName();
26 2
        $instance = new $className;
27 2
        foreach ($this->config as $fieldName => $argumentResolver) {
28 2
            $classField = $this->classInfo->getClassField($fieldName);
29 2
            if ($classField === null) {
30
                continue;
31
            }
32 2
            $value = $argumentResolver->resolve($context);
33 2
            $this->setValue($classField, $value, $instance);
34
        }
35
36 2
        return $instance;
37
    }
38
39 2
    private function setValue(ClassField $field, $value, $resultInstance): void
40
    {
41 2
        if ($value === null && $field->hasDefaultValue()) {
42
            return;
43
        }
44
45 2
        if ($field->isPublic()) {
46 2
            $resultInstance->{$field->getName()} = $value;
47
        } else {
48
            $resultInstance->{$field->getSetter()}($value);
49
        }
50 2
    }
51
52
    public function findByPath(string $path): ?ArgumentResolver
53
    {
54
        return $this->config[$path] ?? null;
55
    }
56
}
57