Factory::createFromArray()   A
last analyzed

Complexity

Conditions 3
Paths 4

Size

Total Lines 8
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 3
nc 4
nop 1
dl 0
loc 8
rs 10
c 1
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace RemotelyLiving\Doorkeeper\Rules;
6
7
final class Factory
8
{
9
    private TypeMapper $ruleTypeMapper;
10
11
    public function __construct(TypeMapper $typeMapper = null)
12
    {
13
        $this->ruleTypeMapper = $typeMapper ?? new TypeMapper();
14
    }
15
16
    public function createFromArray(array $fields): RuleInterface
17
    {
18
        $ruleType = $this->normalizeRuleType($fields['type']);
19
20
        /** @var \RemotelyLiving\Doorkeeper\Rules\RuleInterface $rule */
21
        $rule = isset($fields['value']) ? new $ruleType($fields['value']) : new $ruleType();
22
23
        return isset($fields['prerequisites']) ? $this->addPrerequisites($rule, $fields['prerequisites']) : $rule;
24
    }
25
26
    private function addPrerequisites(RuleInterface $rule, array $prequisites): RuleInterface
27
    {
28
        foreach ($prequisites as $prequisite) {
29
            $preReqType = $this->normalizeRuleType($prequisite['type']);
30
            $preReq = isset($prequisite['value']) ? new $preReqType($prequisite['value']) : new $preReqType();
31
32
            $rule->addPrerequisite($preReq);
33
        }
34
35
        return $rule;
36
    }
37
38
    /**
39
     * @param string|int $type
40
     */
41
    private function normalizeRuleType($type): string
42
    {
43
        if (is_numeric($type)) {
44
            return $this->ruleTypeMapper->getClassNameById((int) $type);
45
        }
46
47
        $fqcnSegments = explode('\\', $type);
48
        $className = array_pop($fqcnSegments);
49
50
        if (class_exists(__NAMESPACE__ . "\\{$className}")) {
51
            return __NAMESPACE__ . "\\{$className}";
52
        }
53
54
        throw new \InvalidArgumentException("{$type} is not a valid rule type");
55
    }
56
}
57